CF_08_Comparable, Comparator 인터페이스
정렬
- 두 대상을 어떤 기준으로 비교해서 자리바꿈을 반복하는 것
-
불변 : 대상, 비교해서 자리바꿈
-
가변 : 기준
- 두 대상을 어떤 기준으로 비교해서 자리바꿈을 반복하는 것
불변 : 대상, 비교해서 자리바꿈
가변 : 기준
-> 이 정렬기준을 제공하는 것이
-> compareTo()
, compare()
등의 객체 정렬에 필요한 메소드
Comparable 인터페이스
-
객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스
-
기본 정렬기준(default)을 구현하는 데 사용
compareTo(Object o)
-
int compareTo(Object o)
-
주어진 객체 o 를 자신(this)과 비교
-
자신(this)이 o보다 크면 1
, 같으면 0
, 작으면 -1
반환
Comparator 인터페이스
-
객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스
-
기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용한다.
compare(Object o1, Object o2)
-
int compare(Object o1, Object o2)
-
주어진 두 객체 o1, o2 비교
-
o1이 o2보다 크면 1
, 같으면 0
, 작으면 -1
반환
compareTo(), compare()
- 이 두 메소드는 두 객체의 비교결과(-1, 0, 1) 를 반환하도록 작성
- ✨✨✨String, Integer, Float, .... 등의 클래스들이 Comparable 인터페이스, Comparator 인터페이스
implements
class String implements Comparable
, class Integer implements Comparable
... 이런식으로
객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스
기본 정렬기준(default)을 구현하는 데 사용
int compareTo(Object o)
주어진 객체 o 를 자신(this)과 비교
자신(this)이 o보다 크면 1
, 같으면 0
, 작으면 -1
반환
-
객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스
-
기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용한다.
compare(Object o1, Object o2)
-
int compare(Object o1, Object o2)
-
주어진 두 객체 o1, o2 비교
-
o1이 o2보다 크면
1
, 같으면0
, 작으면-1
반환
compareTo(), compare()
- 이 두 메소드는 두 객체의 비교결과(-1, 0, 1) 를 반환하도록 작성
- ✨✨✨String, Integer, Float, .... 등의 클래스들이 Comparable 인터페이스, Comparator 인터페이스
implements
class String implements Comparable
, class Integer implements Comparable
... 이런식으로
implements
class String implements Comparable
, class Integer implements Comparable
... 이런식으로- ✨✨참고로 String, Integer 등은 Comparator를 구현하지 않았다!! Comparable만!!!
- 이 클래스 안에서
compareTo()
,compare()
를 구현
sort()
sort(Object[] a)
-
static void sort(Object[] a)
-
객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
-
✨✨이미 그 객체 안에 compareTo()
가 구현되어 있다.
-> ✨기본정렬기준 : 사전순, 오름차순 ...
static void sort(Object[] a)
객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
✨✨이미 그 객체 안에 compareTo()
가 구현되어 있다.
-> ✨기본정렬기준 : 사전순, 오름차순 ...
sort(Object[] a, Comparator c)
-
static void sort(Object[] a, Comparator c)
-
객체배열 a는 대상, c는 기준
-
지정한 Comparator에 의한 정렬
-> ✨특정 기준 : 내림차순 ...
- ✨✨우리는 sort를 신경쓰지 말고, 정렬기준인 Comparator 만 신경쓰면 된다!!
String[] strArr = {"cat", "Dog", "lion", "tiger"};
...
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
//대소문자 구별 안함
//String클래스 안에 Comparator를 구현, compare()를 구현하고 있으며, 대소문자를 구별안하는 결과를 반환하여 CASE_INSENSITIVE_ORDER멤버가 받는다. 그걸 우리가 호출함
-> strArr = [cat, Dog, lion, tiger]
ex11_07
import java.util.Arrays;
import java.util.Comparator;
public class Ex11_07 {
public static void main(String[] args) {
String[] strArr = {"cat", "Dog", "lion", "tiger"};
Arrays.sort(strArr);
//String의 Comparable구현(compareTo()구현)에 의한 정렬+사전순 정렬
System.out.println("strArr = "+Arrays.toString(strArr));
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
//String의 Comparator구현(compare()구현)+대소문자 구별 안함
System.out.println("strArr = "+Arrays.toString(strArr));
Arrays.sort(strArr, new Descending());
//이번엔 직접 만든 기준을 담은 객체를 호출한다.+역순
System.out.println("strArr = "+Arrays.toString(strArr));
}
}
//기존의 compare()를 역순을 배출하는 메소드로 오버라이딩하기
//따라서 compare()를 갖고 있는 Comparator를 구현해야 한다.
class Descending implements Comparator{
public int compare(Object o1, Object o2) {
//Comparable이 o1, o2의 조상타입클래스 또는 구현된인터페이스라면
//이 문제에선, String implements Comparable 이므로 true
//왜 Comparable?? : compareTo()를 쓰려고
if(o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
return c1.compareTo(c2) * -1;
// return c2.compareTo(c1);
}
return -1;
//비교대상이 Comparable을 구현한 클래스가 아니면 비교할 수 없기에
}
}
strArr = [Dog, cat, lion, tiger]
strArr = [cat, Dog, lion, tiger]
strArr = [tiger, lion, cat, Dog]
✨✨✨기억해야 할 것
1. 선언부 : 두 객체를 받기 위해
1) implements Comparator
2) compare(o1, o2)
오버라이딩
2. 구현부 : 실제 compare() 구현부 안에서 비교할 땐
1) instanceof Comparable
2) Comparable c1
, Comparable c2
3) c2.compareTo(c1)
: 역순일 때
두 객체를 받기 위해 compare()를 선언으로 쓰고,
실제 비교를 위해 compareTo()를 구현으로 쓴다.
CompareIntegerTest
import java.util.Arrays;
import java.util.Comparator;
public class CompareIntegerTest {
public static void main(String[] args) {
Integer[] arr = {30, 50, 40, 10, 20};
//Integer을 한 이유는 Comparable, Comparator를 받아야 하니까?
//기본 정렬(오름차순)
Arrays.sort(arr);
System.out.println("arr = "+Arrays.toString(arr));
//내림차순
Arrays.sort(arr, new DescComp());
System.out.println("arr = "+Arrays.toString(arr));
}
}
//Comparable도, Integer도 되네!
class DescComp implements Comparator{
public int compare(Object o1, Object o2) {
if(o1 instanceof Integer && o2 instanceof Integer) {
Integer i1 = (Integer)o1;
Integer i2 = (Integer)o2;
return i1.compareTo(i2)*-1;
// return i2.compareTo(i1);
}
return -1;
}
}
arr = [10, 20, 30, 40, 50]
arr = [50, 40, 30, 20, 10]
✨👀클래스의 메소드 구현부분 보는 방법?
-
해당 클래스에 커서 ->
ctrl+f3
: 클래스가 갖고 있는 멤버들을 보여준다. -
메소드 검색!
- 클릭하면 메소드 구현부분을 볼 수 있다.
Ref
Author And Source
이 문제에 관하여(CF_08_Comparable, Comparator 인터페이스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lecharl/CF08저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)