Contents

Comparable 인터페이스와 Comparator 인터페이스의 차이

Comparable 인터페이스

JAVA에서는 아래의 인터페이스 구현을 통해 정렬의 기준을 프로그래머가 직접 정의할 것을 요구하고 있다.

1
2
3
public interface Comparable<T> {
  int compareTo(T obj);
}

사용 예시는 다음과 같다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Iterator;
import java.util.TreeSet;
class Person implements Comparable<Person> {
    String name;
    int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void showData() {
        System.out.printf("%s %d \n", name, age);
    }
    public int compareTo(Person p) {
        if (age > p.age)
            return 1;
        else if (age < p.age)
            return -1;
        else
            return 0;
    }
}
class ComparablePerson {
    public static void main(String[] args) {
        TreeSet<Person> sTree = new TreeSet<Person>();
        sTree.add(new Person("Lee", 24));
        sTree.add(new Person("Hong", 29));
        sTree.add(new Person("Choi", 21));
        Iterator<Person> itr = sTree.iterator();
        while (itr.hasNext())
            itr.next().showData();
    }
}

Comparator 인터페이스

String 클래스는 이미 compareTo 메소드를 구현하고 있다. 이 때 정령기준을 변경하기 위해서 String 클래스를 상속하는 클래스를 새로 정의하는 것은 번거롭다 따라서 새로운 정렬 기준을 파라미터로 넘길 수 있도록 정의된 것이 Comparator 인터페이스이다.

1
2
3
public interface Comparator<T> {
  int compare(T o1, T o2);
}

사용 예시는 다음과 같다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.TreeSet;
import java.util.Iterator;
import java.util.Comparator;
class StrLenComparator implements Comparator<String> {
    public int compare(String str1, String str2) {
        if (str1.length() > str2.length())
            return 1;
        else if (str1.length() < str2.length())
            return -1;
        else
            return 0;
        /*
         * return str1.length()-str2.length();
         */
    }
}
class IntroComparator {
    public static void main(String[] args) {
        TreeSet<String> tSet = new TreeSet<String>(new StrLenComparator());
        tSet.add("Orange");
        tSet.add("Apple");
        tSet.add("Dog");
        tSet.add("Individual");
        Iterator<String> itr = tSet.iterator();
        while (itr.hasNext())
            System.out.println(itr.next());
    }
}