본문 바로가기

etc.

[Java] 사용자 정의 객체 정렬하기 Comparable과 Comparator 인터페이스

반응형

사용자 정의 객체 배열에서 sort() 메소드를 사용하기 위해 Comparable과 Comparator 인터페이스를 이용한다

 

또, TreeSet의 객체TreeMap의 키는 저장과 동시에 자동 오름차순으로 정렬되는데

이는 정렬을 위해 Comparable 인터페이스의 compareTo() 메소드를 구현하고있다

 

다음 코드는 Comparable 구현 클래스이다

 

public class Person implents Comparable<Person> {
    public String name;
    public int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    //getter
    //setter
    
    @Override
    public int compareTo(Person o) {
        if(age > o.age) return 1;
        else if (age == o.age) return 0;
        else return -1;
    }
    /* 주어진 객체보다 크면 양수, 같으면 0, 작으면 음수 리턴 */
}
import java.util.*;

public class Main {
    public static void main(String args[]) {
        TreeSet<Person> treeSet = new TreeSet<Person>();
        
        treeSet.add(new Person("aaa", 20);
        treeSet.add(new Person("bbb", 30);
        treeSet.add(new Person("ccc", 10);
        
        Iterator<Person> iterator = treeSet.iterator();
        while(iterator.hasNext()) {
            Person p = iterator.next();
            System.out.println(p.name + " : " + p.age);
        }
    }
}

 

위처럼 Comparable을 구현(implements)하고 있ㄴ지 않을 경우에는 ClassCastException이 발생한다

그렇다면 다른 방법은 무엇이 있을까?

 

TreeSet 또는 TreeMap 생성자의 매개값으로 Comparator(정렬자)를 제공하면 가능하다

Comparator 인터페이스에는 compare() 메소드가 구현되어있다

이는 보통 일회용으로 사용하기 때문에, 익명 구현 객체로 주로 이용한다

 

다음 코드는 Comparator 구현 클래스이다

 

public class ascendingComparaotr implents Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        if(o1.age > o2.age) return 1;
        else if(o1.age == o2.age) return 0;
        else return -1;
    }
    /* o1의 나이가 많을 경우 양수를 리턴하여
    나이가 많으면 뒤에 오게 함 */
}
import java.util.*;

public class Main {
    public static void main(String args[]) {
        TreeSet<Person> treeSet = new TreeSet<Person>(new AscendingComparator());
        
        // 오름차순 정렬자를 제공하지 않았다면,
        // Comparable을 구현하지 않았기 때문에
        // 아래 add() 메소드에서 ClassCastException 예외 발생
        treeSet.add(new Person("aaa", 20);
        treeSet.add(new Person("bbb", 30);
        treeSet.add(new Person("ccc", 10);
        
        Iterator<Person> iterator = treeSet.iterator();
        while(iterator.hasNext()) {
            Person p = iterator.next();
            System.out.println(p.name + " : " + p.age);
        }
    }
}

 

다음 코드는 Comparator 인터페이스 익명 구현 객체로 선언한 클래스이다

 

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Comparator<Employee> AscendingComparaotr = new Comparator<Employee>() {
            @Override
            public int compare(Person o1, Person o2) {
                if(o1.age > o2.age) return 1;
                else if(o1.age == o2.age) return 0;
                else return -1;
            }
        };
        
        TreeSet<Person> treeSet = new TreeSet<Person>(new AscendingComparator());
        
        // 오름차순 정렬자를 제공하지 않았다면,
        // Comparable을 구현하지 않았기 때문에
        // 아래 add() 메소드에서 ClassCastException 예외 발생
        treeSet.add(new Person("aaa", 20);
        treeSet.add(new Person("bbb", 30);
        treeSet.add(new Person("ccc", 10);
        
        Iterator<Person> iterator = treeSet.iterator();
        while(iterator.hasNext()) {
            Person p = iterator.next();
            System.out.println(p.name + " : " + p.age);
        }
    }
}

 

이와 같이

Comparable 인터페이스를 구현하여 하는 방법(compareTo() 메소드)과,

Comparator 인터페이스를 구현하여 정렬자로 제공하는 방법(compare() 메소드)이 있다

반응형