JAVA | 사용자 정의 객체 정렬 | Comparable<객체>

728x90

⬛ 사용자 정의 객체 정렬 | Comparable<객체>

💡 (1) Comparable을 이용하여 Java 객체를 정렬할 수 있다.

💡 (2) Comparator을 이용하여 Java 객체를 정렬할 수 있다.

⬛ 객체 정렬

  • 객체를 사용자가 정의한 정렬 기준에 맞춰 정렬해야 하는 경우
    • Ex) 좌표를 x좌표가 증가하는 순, x좌표가 같으면 y좌표가 감소하는 순으로 정렬
    • Ex) 국어점수는 증가하는 순, 수학점수는 감소하는 순으로 정렬

⬛ Comparable 인터페이스 사용

  • 기본적으로 적용될 정렬 기준이 되는 메소드 정의하는 인터페이스
  1. 정렬할 객체에 Comparable interface를 implements 후,
  2. compareTo() 메서드를 오버라이드하여 구현한다.

🟪 compareTo() 메소드 사용법 | 기본 int형 정렬

  • (1) 현재 개체 < 파라미터로 넘어온 객체 : 음수 리턴
  • (2) 현재 객체 == 파라미터로 넘어온 객체 : ‘0’ 리턴
  • (3) 현재 객체 > 파라미터로 넘어온 객체 : 양수 리턴
  • ⇒ 음수 or ‘0’ 이면, 객체의 자리가 그대로 유지
  • ⇒ 양수이면, 두 객체 자리가 바뀐다.

    @Override
    public int compareTo(Point p) {
        return this.필드 - p.필드; //기본 오름차순 정렬 
				return p.필드 - this.필드; //내림차순 정렬 
    }
}
// x좌표가 증가하는 순, x좌표가 같으면 y좌표가 감소하는 순으로 정렬하라.
class Point implements Comparable<Point> {
    int x, y;

    @Override
    public int compareTo(Point p) {
        if(this.x > p.x) {
            return 1; // x에 대해서는 오름차순
        }
        else if(this.x == p.x) {
            if(this.y < p.y) { // y에 대해서는 내림차순
                return 1;
            }
        }
        return -1;
    }
}

// main에서 사용법
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
Collections.sort(pointList);


🟪 compareTo() 메소드 사용법 | String 형 정렬

compareTo() 반환값 기준 :

  1. 양수 반환 : this 객체 > 파라미터 객체 : 즉 두 객체의 자리를 바꾸고
  2. 음수 반환 : this 객체 < 파라미터 객체
  3. 0 반환 : 두 객체가 같다

compareTo를 사용한 문자열 비교

compareTo는 두 문자열이 단순히 같은지 아닌지를 알려줄 뿐만 아니라 어떤것이 사전적인 순서로 더 앞,뒤에 존재하는지를 알려준다.

반환값이 음수이면 compareTo를 호출하는 문자열이 더 앞에 있다는 뜻이고

반환값이 0이면 두 문자열이 같다는 뜻이고

반환값이 양수이면 매개변수로 입력되는 문자열이 더 앞에 있다는 뜻이다.

String 문자열 간 사전순 정렬

class Market implements Comparable<Store>{
      String name;
      String phoneNum;
      String address;

       @Override
      public int compareTo(Market m) {
					//int형에 this.name 과 타 객체의 name 필드 비교한 값을 담고
					// 그 결과값을 기준으로
          int compareResult = this.name.compareTo(m.name);
          if (compareResult < 0) {
              return -1;
          } else if (compareResult > 0) {
              return 1;
          }
          return 0;
      }
  }
728x90