-
자바의정석 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] 이렇게 역순으로 정렬된 출력결과를 볼수있다.
반응형'Java > 자바의정석' 카테고리의 다른 글
자바[JAVA] - Comparable과 Comparator의 이해 (0) 2023.02.28 자바 [JAVA] - HashSet개념 및 활용 (0) 2023.02.27 자바의정석 Arrays여러가지 메서드 (0) 2023.02.27 자바 Iterator란? (0) 2023.02.27 자바 Queue 활용해보기 (0) 2023.02.27