본문 바로가기
java

collections framework - Comparator 와 Comparable

by proudev 2023. 9. 2.

객체 정렬에 필요한 매서드(정렬기준 제공)를 정의한 인터페이스

Comparable 기본 정렬기준을 구현하는데 사용
Comparator 기본 정렬기준 외에 다른 기준으로 정렬하고자할때 사용

 

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

public interface Comparable {
    int compareTo(Object o);     주어진 객체(o)를 자신(this)과 비교
}

 

연습문제 

class Ex11_7 {
    public static void main(String[] args){
       String[] strArr = {"cat", "Dog", "lion", "tiger"};
       
       Arrays.sort(strArr);  String의 Comparable구현에 의한 정렬
       System.out.println("strArr=" + Arrays.toString(strArr));
       // strArr = [Dog, cat, lion, tiger] 
       
       Arrays.sort(strArr, String.CASE_INSENSTIVE_ORDER);   대소문자 구분 안함
       String 클래스에 있는 static 상수 
       
       System.out.println("strArr=" + Arrays.toString(strArr));
       // strArr = [cat, Dog, lion, tiger]
    
       Arrays.sort(strArr, new Descending());  역순정렬(기본 정렬의 반대)
       System.out.println("strArr=" + Arrays.toString(strArr));    
       // strArr = [tiger, lion, cat, Dog]
    }
    
    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)과 같다.
         }
         return -1;      
      }
   }  
}

 

정렬할때는 [대상], [기준]이 필요하다.

아래의 sort매서드에서는 Object[ ]가 대상이고, Comparator가 정렬 기준이 된다.

근데 static void sort(Object [] a)는 기준이 없다. 그래도 적용되는 이유는 해당 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬이 있기 때문이다.

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

 

아래와 같이 String은 Comparable 인터페이스를 구현 받아 compareTo를 따로 정렬기준이 없어도 된다.

class String implements Comparable{
   int compareTo(){} // 기본정렬기준(사전순 ABCabc)
}

Integer와 Comparable

(중요) String, Integer, Boolean, Float, Double, Character 등 비교가능한 타입들은 기본적으로 implement Comparable를 구현한다. 그래서 기본 정렬 기준을 제공한다. 기본정렬(default) 정렬기준이 없을때 사용

 

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;
      
      return thisVal<anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1)); 
      //return thisVal - anotherVal; 동일함
      근데 연산(뺄셈)을 안하고 삼항연산자를 사용하는가... 성능이 약간 더 빠름
   }
}

 

정렬: 두 대상 비교, 자리바꿈 반복(정렬 방법은 불변이나, 정렬 기준은 가변) 

static void sort(int[] intArr){
  반복문은 불변(자리바꿈 역할)!!!
  for(int i=0;i<intArr.length-1;i++){
     for(int j=0;j<intArr.length-1-i;j++){
        int tmp = 0;
        
        조건문은 가변(정렬기준)!!!
        if(intArr[j] > intArr[j+1]){
          tmp = intArr[j];
          intArr[j] = intArr[j+1];
          intArr[j+1] = tmp;        
        }
     }
  }
}

 

static void sort(Object[] objArr, Comparator c){
   for(int i=0;i<objArr.length-1;i++){
      for(int j=0;j<objArr.length-1-i;j++){
         Object tmp = null;
         
         if(c.compare(objArr[j], objArr[j+1]>0){
            tmp = objArr[j];
            objArr[j] = objArr[j+1];
            objArr[j+1] = tmp;
         }      
      }
   }
}

'java' 카테고리의 다른 글

collections framework - TreeSet  (0) 2023.09.02
collections framework - HashSet  (0) 2023.09.02
collection framework : Arrays  (0) 2023.09.01
collection framework : Iterator, Enumeration, Map  (0) 2023.08.31
collection framework  (0) 2023.08.31

댓글