Comparable 인터페이스의 경우 compareTo() 메서드를 정의하는데, 객체를 정렬하기 위해 사용한다. Java에서 같은 타입의 인스턴스를 비교해야 하는 클래스의 경우 모두 Comparable 인터페이스를 구현하였다. 따라서 Boolean을 제외한 래퍼 클래스나 String, Date, Time 등의 인스턴스는 모두 정렬 가능하다.
compareTo는 정렬 시 앞에 와야 되는 인스턴스에서 호출할 시 음수, 뒤에 와야 되는 인스턴스에서 호출할 시 양수를 반환하고, 호출하는 인스턴스와 매개변수로 들어가는 인스턴스가 같은 순서로 정렬되는 경우 0을 반환한다.
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;
}
}
}
public class Comparable01 {
public static void main(String[] args) {
Car car01 = new Car("아반떼", 2016, "노란색");
Car car02 = new Car("소나타", 2010, "흰색");
System.out.println(car01.compareTo(car02));
}
}
Comparable과 같이 객체를 정렬하는데 사용된다. 그러나 Comparable은 객체가 단 한 가지 방식으로 정렬되어야 할 때 사용할 수 있고, Comparator는 객체가 여러가지 방식으로 정렬될 때 사용된다. Comparator는 구현하는 경우 compare() 메서드를 재정의하여 사용한다.
메서드 | 설명 |
---|---|
int compare(T o1, T o2) | 전달된 두 객체의 순서를 비교함. |
boolean equals(Object obj) | 해당 comparator와 전달된 객체가 같은지를 확인함. |
default Comparator reversed() | 해당 comparator의 역순인 comparator를 반환함. |
import java.util.*;
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;
}
}
public class Comparable02 {
public static void main(String[] args) {
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());
}
}
}
http://tcpschool.com/java/java_collectionFramework_comparable