반응형

1.7 Comparator, Comparable

 

Arrays.sort() 호출시 배열을 정렬하나, 사실은 Character 클래스의 Comparable의 구현에 의해 정렬됨.

 

Comparator, Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의함.

 

- Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용.

- Comparable : 기본 정렬기준을 구현하는데 사용.

 

package Collection_Framework;
import java.util.*;
public class comparator1 {
 public static void main(String []arge) {
  String[] strArr = {"cat","dog", "lion","tiger"};
  
  Arrays.sort(strArr);
  System.out.println("strArr=" + Arrays.toString(strArr));
  
  Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
  System.out.println("strArr=" + Arrays.toString(strArr));
  
  Arrays.sort(strArr, new Descending());
  System.out.println("strArr=" + Arrays.toString(strArr));
  
 }
}

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;
  }
  return -1;
 }
}

 

 

출력결과 :

strArr=[cat, dog, lion, tiger]
strArr=[cat, dog, lion, tiger]
strArr=[tiger, lion, dog, cat]

 

 

* String의 Comparable 구현은 문자열이 사전순으로 정렬됨. 오름차순 정력은 공백, 숫자, 대문자, 소문자 순으로 정렬됨.

즉, 유니코드 순서가 작은값에서 큰값으로 정렬됨.

 

* 대소문자를 구분하지 않고 비교하는 Comparator를 상수의 형태로 제공.

public static final Comparator CASE_INSENSITIE_ORDER

 

> Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); 사용시 대소문자 구분없이 정렬가능.

 

* 내림차순 정렬

String에 구현된 compareTo()의 결과에 -1을 곱하기만 하면 된다. 비교하는 객체의 위치를 바꿔서 c2.compareTo(c1)과 같이 해도 된다.

 

매개변수가 Object타입이기 때문에, compareTo()를 바로 호출 할수 없으므로 Comparable로 형변환 해야 한다.

 

class Descending() 참고.

 

 

반응형

+ Recent posts