ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바의정석 Comparator 활용하기
    Java/자바의정석 2023. 2. 27. 23:29
    반응형

    자바의정석 Comparator활용하기!

    아래의 코드는 자바의정석 예제코드이다.

    package JavaChap11;
    import java.util.*;
    
    class Ex11_7 {
        public static void main(String[] args) {
            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=[Dog, cat, lion, tiger]
    strArr=[cat, Dog, lion, tiger]
    strArr=[tiger, lion, cat, Dog]


    String[] strArr = {"cat", "Dog", "lion", "tiger"};

    우선 strArr의 배열객체를 생성한다.

     

    Sort()

    Arrays.sort(strArr);
    System.out.println("strArr=" + Arrays.toString(strArr));

    해당 코드를 출력한다면 strArr=[Dog, cat, lion, tiger] 이와같이 정렬되어나오게된다.

    문자열을 정렬할때는 대문자가 우선시된다는 점 참고하자.

     

     

    CASE_INSENSITIVIE_ORDER

    Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);

    CASE_INSENSITIVE_ORDER를 사용한다면 대소문자를 구분하지 않는다.

    strArr : 정렬대상,  CASE_INSENSITIVE_ORDER : 정렬기준

    System.out.println("strArr=" + Arrays.toString(strArr));

    대소문자 구분없이 출력한다면 strArr=[cat, Dog, lion, tiger] 이와같은 출력결과가 나온다.

     

    Comparator 인터페이스를 상속받은 Descending클래스를 살펴보자

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

    양수 : 양수 / 0 : 0 / 음수 : 음수 

    이와같이 값을 출력해주는데 지금 코드는 * -1을 해주어 

    양수 : 음수 / 0 : 0 / 음수 : 양수 

    이와같이 반대로 출력하도록 구성하였다

    c1.compareTo(c2) *1 => c2.compareTo(c1)와 같이 순서를 바꿔도 된다.

     

    Arrays.sort(strArr, new Descending())

    정렬대상 : strArr , 정렬기준 : new Descending()  ==> 역순으로 정렬(내림차순)

    System.out.println("strArr=" + Arrays.toString(strArr));

     

    출력을한다면 strArr=[tiger, lion, cat, Dog] 와같은 출력결과가 나온다.

     


    이제 문자열이 아닌 Integer형태를 한번 살펴보자

    class Ex11_8 {
        public static void main(String[] args) {
            Integer[] arr = { 30, 50, 10, 40, 20 };
    
            Arrays.sort(arr); // Integer가 가지고 있는 기본 정렬기준 compareTo()로 정렬
            System.out.println(Arrays.toString(arr));
    
            // sort(Object[] objArr, Comparator c)
            Arrays.sort(arr, new DescComp()); // DescComp에 구현된 정렬 기준으로 정렬
            System.out.println(Arrays.toString(arr));
        } // main
    }
    
    class DescComp implements Comparator {
        public int compare(Object o1, Object o2) {
            if(!(o1 instanceof Integer && o2 instanceof Integer))
                return -1; // Integer가 아니면, 비교하지 않고 -1 반환
    
            Integer i  = (Integer)o1;
            Integer i2 = (Integer)o2;
    
            // return i2 - i; 또는 return i2.compareTo(i);도 가능
            return i.compareTo(i2) * -1; // 기본 정렬인 compareTo()의 역순으로 정렬
        }
    }

    ===============실행결과===============

    [10, 20, 30, 40, 50]
    [50, 40, 30, 20, 10]


    Integer[] arr = { 30, 50, 10, 40, 20 };

    이와같은 Integer로 구성된 배열을 생성한다.

     

    Arrays.sort(arr); // Integer가 가지고 있는 기본 정렬기준 compareTo()로 정렬
    System.out.println(Arrays.toString(arr));

    기본정렬을 사용하여 정렬을 한다면 [10, 20, 30, 40, 50] 이와같이 기본적으로 오름차순으로 정렬되어 출력이된다.

     

     

    class DescComp implements Comparator {
        public int compare(Object o1, Object o2) {
            if(!(o1 instanceof Integer && o2 instanceof Integer))
                return -1; // Integer가 아니면, 비교하지 않고 -1 반환
    
            Integer i  = (Integer)o1;
            Integer i2 = (Integer)o2;
    
            // return i2 - i; 또는 return i2.compareTo(i);도 가능
            return i.compareTo(i2) * -1; // 기본 정렬인 compareTo()의 역순으로 정렬
        }
    }

    역순으로 정렬하는 클래스를 작성한다. 윙에서 했던 내용과 다른 내용은 return값을 조금 바꾸었다.

     

    Arrays.sort(arr, new DescComp()); // DescComp에 구현된 정렬 기준으로 정렬
    System.out.println(Arrays.toString(arr));

    나머지 코드도 출력한다면 [50, 40, 30, 20, 10] 이렇게 역순으로 정렬된 출력결과를 볼수있다.

    반응형

    댓글

Designed by Tistory.