본문 바로가기
JAVA/컬렉션 프레임워크

Comparator와 Comparable

by chogigang 2023. 2. 24.

Comparator(기본외) Comparable(기본)(정렬 기준 제공)

 

모두 인터페이스 컬랙션을 정렬하는데 필요한 메서드를 정의 합니다.

 

정렬sort()

1.두 대상비교

2.자리바꿈

 

반복

 

  • Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의
  • Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들, 주로 Integer와 같은 wrapper클래스와 String, Date, File과 같은 것들이며 기본적으로 오름차순, 즉 작은 값에서부터 큰 값의 순으로 정렬되도록 구현되어 있습니다.
  • Comparable을 구현한 클래스는 정렬이 가능하다는 것을 의미합니다

 

public interface Comparator{
    int compare(Object o1, Object o2);
    boolean equals(Object obj);
}

public interface Comparable{
    public int compareTo(Object o);
}

 

  • compare()와 compareTo()는 선언형태와 이름이 약간 다를 뿐 두 객체를 비교한다는 같은 기능을 목적으로 고안
  • compareTo()의 반환값은 int이지만 실제로는 비교하는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해야합니다.
  • compare()도 객체를 비교해서 음수, 0, 양수 중의 하나를 반환하도록 구현해야합니다.
   public final class Integer extends Number implements Comparable{
   ...
        public int compareTo(Object o){
            return compareTo((Integer)o);
        }
        public int compareTo(Integer anotherInteger){
            int thisVal = this.value;
            int anotherVal = anotherInteger.value;

            // 비교하는 값이 크면 -1, 같으면 0, 작으면 1을 반혼한다.
            return (thisVal<anotherVal ? -1 : (thisVal == anotherVal ? 0 :1));
        }
...
    }
 class ComparatorEx{
     public static void main(String[] args){
         String[] strArr = {"cat","Dog","lion","tiger");

         Arrays.sort(strArr); // String의 Comparable구현에 의한 정렬
         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; // -1을 곱해서 기본 정렬방식의 역으로 변경한다. 
                 // 또는 c2.compareTo(c1)와 같이 순서를 바꿔도 된다.
             }
             return -1;
         }
     }

rays.sort()는 배열을 정렬할 때, Comparator를 지정해주지 않으면 저장하는 객체(주로 Comparable을 구현한 클래스의 객체에 구현된 내용에 따라 정렬됩니다.

 

static void sort(Object[] a) // 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
static void sort(Object[] a, Comparator c) //지정한 Comparator에 의한 정렬

String의 Comparable구현은 문자열이 사전 순으로 정렬되도록 작성되어 있습니다.
문자열의 오름차순 정렬은 공백, 숫자, 대문자, 소문자의 순으로 정렬되는 것을 의미합니다.

'JAVA > 컬렉션 프레임워크' 카테고리의 다른 글

Arrays  (1) 2023.03.24
컬렉션 클래스 정리&요약  (0) 2023.02.24
hashSet,TreeSet,HashMap,Hashtable,Collections  (0) 2023.02.24
ArrayList,LinkedList,lterator  (0) 2023.02.24
컬렉션 프레임웍  (0) 2023.02.24