- 두 대상을 어떤 기준으로 비교해서 자리바꿈을 반복하는 것
불변 : 대상, 비교해서 자리바꿈
가변 : 기준
-> 이 정렬기준을 제공하는 것이
-> compareTo()
, compare()
등의 객체 정렬에 필요한 메소드
객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스
기본 정렬기준(default)을 구현하는 데 사용
int compareTo(Object o)
주어진 객체 o 를 자신(this)과 비교
자신(this)이 o보다 크면 1
, 같으면 0
, 작으면 -1
반환
객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스
기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용한다.
int compare(Object o1, Object o2)
주어진 두 객체 o1, o2 비교
o1이 o2보다 크면 1
, 같으면 0
, 작으면 -1
반환
implements
class String implements Comparable
, class Integer implements Comparable
... 이런식으로compareTo()
, compare()
를 구현static void sort(Object[] a)
객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
✨✨이미 그 객체 안에 compareTo()
가 구현되어 있다.
-> ✨기본정렬기준 : 사전순, 오름차순 ...
static void sort(Object[] a, Comparator c)
객체배열 a는 대상, c는 기준
지정한 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) implements Comparator
2) compare(o1, o2)
오버라이딩
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
: 클래스가 갖고 있는 멤버들을 보여준다.
메소드 검색!