Comparable과 Comparator
포스트
취소

Comparable과 Comparator

Comparable<T> 인터페이스

  • 객체를 정렬하는 데 사용되는 메소드인 compareTo() 메소드를 정의하는 인터페이스
  • Java에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다.
    • Boolean을 제외한 래퍼 클래스나 String, Time, Date와 같은 클래스의 인스턴스는 모두 정렬이 가능하다.
  • 기본 정렬 순서는 오름차순이다.
  • 메소드
    • compareTo(T o)
      • 해당 객체와 전달된 객체의 순서를 비교한다.
  • 사용 예시
//예시 클래스
class Car implements Comparable<Car> {
    private String modelName;
    private int modelYear;
    private String color;

    Car(String mn, int my, String c) {
        this.modelName = mn;
        this.modelYear = my;
        this.color = c;
    }

    public String getModel() {
        return this.modelYear + "식 " + this.modelName + " " + this.color;
    }

    public int compareTo(Car obj) {
        if (this.modelYear == obj.modelYear) {
            return 0;
        } else if(this.modelYear < obj.modelYear) {
            return -1;
        } else {
            return 1;
        }
    }
}

//사용 방법
Car car01 = new Car("아반떼", 2016, "노란색");
Car car02 = new Car("소나타", 2010, "흰색");
System.out.println(car01.compareTo(car02));

Comparator<T> 인터페이스

  • 객체를 정렬하는 데 사용되는 인터페이스
  • 기본적으로 오름차순으로 정렬된다.
    • 내림차순이나 다른 기준으로 정렬하고 싶을 때 사용할 수 있다.
      • Comparator 인터페이스를 구현하면 오름차순 이외의 기준으로도 정렬할 수 있다.
  • Comparator 인터페이스를 구현한 클래스에서는 compare() 메소드를 재정의하여 사용한다.
  • 메소드
    • compare(T o1, T o2)
      • 전달된 두 객체의 순서를 비교한다.
    • equals(Object obj)
      • 해당 comparator와 전달된 객체가 같은지를 확인한다.
    • reversed()
      • 해당 comparator의 역순인 comparator를 반환한다.
  • 사용 예시
//예시 클래스
class DescendingOrder implements Comparator<Integer> {
    public int compare(Integer o1, Integer o2) {
        if(o1 instanceof Comparable && o2 instanceof Comparable) {
            Integer c1 = (Integer)o1;
            Integer c2 = (Integer)o2;
            return c2.compareTo(c1);
        }
        return -1;
    }

}

//사용 방법
TreeSet<Integer> ts = new TreeSet<Integer>(new DescendingOrder());
ts.add(30);
ts.add(40);
ts.add(20);
ts.add(10);
Iterator<Integer> iter = ts.iterator();
while(iter.hasNext()) {
    System.out.println(iter.next());
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.