Comparator와 Comparable
객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
compare( )와 compareTo( )는 두 객체의 비교결과를 반환하도록 작성
같으면 0, 오른쪽이 크면 음수, 왼쪽이 크면 양수
public interface Comparable {
int compareTo(Object o); // 주어진 객체(o)를 자신과 비교
}
public interface Comparator {
int compare(Object o1, Object o2); // o1, o2 두 객체를 비교
boolean equals(Object obj); // euquals를 오버라이딩 하라는 뜻
}
Comparable
기본 정렬 기준을 구현하는데 사용(디폴트)
Comparator
기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용
객체와 자기자신(this)와 비교
public class Ex1 {
public static void main(String[] args) {
String[] stArr = {"cat", "Dog", "lion", "tiger"};
Arrays.sort(stArr); // String의 Comparable 구현에 의한 정렬(정렬 대상)
System.out.println("stArr = " + Arrays.toString(stArr));
Arrays.sort(stArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분안함
System.out.println("stArr = " + Arrays.toString(stArr));
Arrays.sort(stArr, new Descending()); // 역순 정렬(정렬대상, 정렬기준)
System.out.println("stArr = " + Arrays.toString(stArr));
}
}
class Descending implements Comparator {
public int compare(Object o1, Object o2) {
if (o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable) o1;
Comparable c2 = (Comparable) o2;
return c1.compareTo(c2) * -1; // -1을 곱해서 기본 정렬방식의 역으로 변경한다.
// return c2.compareTo(c1) // 또는 c2.compareTo(c1)와 같이 순서를 바꿔도 된다.
}
return -1; // 비교할 수 없는 대상
}
}
stArr = [Dog, cat, lion, tiger] // 기본정렬
stArr = [cat, Dog, lion, tiger]
stArr = [tiger, lion, cat, Dog] // 기본정렬 역순
정렬기준을 정해주고 싶다면 Comparator를 구현한 클래스가 필요하다!
-1을 곱해 음수(-1)일 때는 양수가 되고 양수가 될 때는 음수(-1)이 된다.
따라서 역순으로 정렬이 된다.
static void sort(Object[] a); // 객체 배열에 저장된 객체가 구현한 Comparable 에 의한 정렬
static void sort(Object[] a, Comparator); // 지정한 Comparator에 의한 정렬
기본적으로 정렬을 하려면 대상과 정렬기준이 필요하다.
대상만 파라미터로 받는 메서드는 대상이 String 처럼 comparable이 구현되어 있어야 한다.
'Java' 카테고리의 다른 글
[Java] TreeSet 범위 탐색, 정렬 (0) | 2024.05.08 |
---|---|
[Java] HashSet 객체 중복제거, 집합 (0) | 2024.05.08 |
[Java] Arrays - 배열을 쉽게 다루고 싶다면 (0) | 2024.05.07 |
[Java] Iterator, Listlterator, Enumeration (0) | 2024.05.07 |
[Java] Stack과 Queue (0) | 2024.05.07 |