Comparable, Comparator 모두 인터페이스이며
객체정렬에 필요한 메서드가 정의되어있다.
public interface Comparable { int compareTo(Object o); }
매개변수로 주어진 객체 o를 객체 본인과 비교한다.
compareTo의 값이 음수이면 왼쪽보다 오른쪽이 크다는것이다. 양수이면 오른쪽이 왼쪽보다 크다. 0이면 같다.
public interface Comparator{ int compare(Object o1, Object o2); }
기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용
compare의 값이 음수이면 왼쪽보다 오른쪽이 크다는것이다. 양수이면 오른쪽이 왼쪽보다 크다. 0이면 같다.
예제를 살펴보자,
키와 몸무게가 주어진 여러 사람들이 있다.
이 사람들을 키가 큰 순서대로 정렬하고 키가 같을시 몸무게가 작은 순서대로 정렬하는 방법은?
package feb16;
import java.util.Arrays;
import java.util.Comparator;
public class test {
public static void main(String[] args) {
int[][] arr = {{160, 58}, {180, 80}, {160, 49}};
Arrays.sort(arr, new myorder()); // myorder2() 도 가능
System.out.println(Arrays.deepToString(arr));
}
public static class myorder implements Comparator<int[]>{
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] == o2[0] ? (o1[1] - o2[1]) : o2[0] - o1[0];
}
}
public static class myorder2 implements Comparator{
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof int[] && o2 instanceof int[]) {
int[] o11 = (int[])o1;
int[] o22 = (int[])o2;
return o11[0] == o22[0] ? o11[1] - o22[1] : o22[0] - o11[0];
}
return -1;
}
}
}
이런식으로 Integer 타입의 2차원 배열로 사람들의 키랑 몸무게를 담아서
Comparator를 구현하는 클래스를 만들어서 사용할 수 있다.
대신 이러한 방법은 Comparable은 사용하지 못한다.
package feb16;
import java.util.Arrays;
public class test2 {
public static class Person implements Comparable<Person>{
public int height;
public int weight;
public Person(int height, int weight) {
this.height = height;
this.weight = weight;
}
@Override
public int compareTo(Person o) {
return this.height == o.height ? this.weight - o.weight : o.weight - this.weight;
}
@Override
public String toString() {
return "Person [height=" + height + ", weight=" + weight + "]";
}
}
public static void main(String[] args) {
Person[] parr = new Person[3];
parr[0] = new Person(160, 58);
parr[1] = new Person(180, 80);
parr[2] = new Person(160, 49);
Arrays.sort(parr);
for (int i = 0; i < 3; i++) {
System.out.println(parr[i]);
}
}
}
이처럼 클래스를 이용하면 기본적으로 comparable 을 사용할수 있다.
이게 실제로 알고리즘 코딩테스트를 풀때 가장 많이 사용하는 방법이다.
package feb16;
import java.util.Arrays;
import java.util.Comparator;
public class test3 {
public static class Person {
public int height;
public int weight;
public Person(int height, int weight) {
this.height = height;
this.weight = weight;
}
@Override
public String toString() {
return "Person [height=" + height + ", weight=" + weight + "]";
}
}
public static void main(String[] args) {
Person[] parr = new Person[3];
parr[0] = new Person(160, 58);
parr[1] = new Person(180, 80);
parr[2] = new Person(160, 49);
Arrays.sort(parr, new Myorder());
for (int i = 0; i < 3; i++) {
System.out.println(parr[i]);
}
}
public static class Myorder implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.height == o2.height ? o1.weight - o2.weight : o2.weight - o1.weight;
}
}
}
아니면 이런식으로 클래스를 사용하더라도
따로 Comparator를 구현하는 클래스를 만들어서 사용할수도 있다.