반응형
사용자 정의 객체 배열에서 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() 메소드)이 있다
반응형
'etc.' 카테고리의 다른 글
[C/C++] memset() 함수 사용과 주의점 (0) | 2020.11.03 |
---|---|
갤럭시에서 음악 틀면서 영상 촬영하는 무료 어플 (0) | 2020.10.21 |
[백준 9095번][Java] 1, 2, 3 더하기 (0) | 2020.07.13 |
[백준 9095번][C] 1, 2, 3 더하기 (0) | 2020.07.13 |
[Java] sort() 메소드 정렬하기 (Arrays, Collections, Comparable, Comparator) (0) | 2020.07.12 |