Ch11-30~33. Comparable
0. 목차
Chapter11. 컬렉션 프레임웍
Ch11 - 30. Comparator와 Comparable
Ch11 - 31. Comparator와 Comparable 예제
Ch11 - 32. Integer와 Comparable
Ch11 - 33. Integer와 Comparable 예제
Ch11 - 30. Comparator와 Comparable
▶ Comparator와 Comparable이란?
▷ 객체 정렬에 필요한 메서드를 정의한 인터페이스
▷ 메서드 : 정렬 기준 제공을 목적으로 함
▷ 정렬 = sort() = 두 대상 비교 후, 자리 바꿈
▷ 정렬 기준 : 오름차순, 내림차순…
▷ 컴퓨터가 스스로 정렬 기준 찾지 못함
▷ 컴퓨터가 정렬 기준대로 정렬하도록 할 때 사용하는 인터페이스
▶ Comparator란?
▷ 기본 정렬 기준을 구현
▷ default 정렬 기준
- Comparator code
public interface Comparator { int compare(Object o1, Object o2); // o1 vs o2 boolean equals(Object obj); // equals를 오버라이딩 하라는 뜻 }
▶ Comparable이란?
▷ 기본 정렬 기준 외 다른 기준으로 정렬하고자 할 때
- Comparable code
public interface Comparable { int compareTo(Object o); // 주어진 객체(o) vs 자신(this) }
▶ compare()
& compareTo()
▷ 반환
a > b : +
a = b : 0
a < b : -
▷ compare()
와 compareTo()
는 두 객체의 비교 결과를 반환하도록 작성
public final class Integer extends Number implements Comparable {
...
public in t compareTo(Integer anotherInteger) {
int v1 = this.value;
int v2 = anotherInteger.value;
return (v1 < v2 ? -1 : (v1 == v2? 0 : 1));
}
}
▷ compare()
와 compareTo()
의 반환 결과에 따라 자리 바꿈 결정
- 오름차순↗ : 5 7 비교
int v1 = 5; int v2 = 7; int compare(v1, v2);
5 < 7 - - : 자리 바꿈 필요X(5 ↗ 7)
- 내림차순↘ : 5 7 비교
int v1 = 5; int v2 = 7; int compare(v1, v2);
5 < 7 - - : 자리 바꿈 필요(5 ↘ 7)
Ch11 - 31. Comparator와 Comparable 예제
▶ sort(String[])
String[] strArr = {"cat", "Dog", "lion", "tiger"};
▷ strArr 정렬 기준 생략
▷ strArr = String[]
▷ Arrays.sort(strArr, 정렬 기준 없음); → 기본 정렬 기준 적용
- 정렬 대상 : strArr
- 정렬 기준 : String의 Comparable에 의한 정렬
class String implements Comparable { // 기본 정렬 기준, String은 사전순 - ABC ... int compareTo(); // Comparable 안에 compareTo 있음 ... }
Arrays.sort(strArr); // console strArr = [Dog, cat, lion, tiger]
▶ sort(String[], 정렬 기준)
String[] strArr = {"cat", "Dog", "lion", "tiger"};
▷ strArr 정렬 기준대로 정렬
▷ Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
- 정렬 대상 : strArr
- 정렬 기준 : String.CASE_INSENSITIVE_ORDER
public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분X // console strArr = [cat, Dog, lion, tiger]
▶ sort(String[], 정렬 기준)
String[] strArr = {"cat", "Dog", "lion", "tiger"};
▷ strArr 정렬 기준대로 정렬
▷ Arrays.sort(strArr, new Descending());
- 정렬 대상 : strArr
- 정렬 기준 : 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 ; // '0', '+', '-'로 반환 → × -1 역으로 변경, c2.compareTo(c1)와 같이 순서를 바꿔도 같은 결과 } return -1; } }
Arrays.sort(strArr, new Descending()); // 역순 정렬 // console strArr = [tiger, lion, cat, Dog]
Ch11 - 32. Integer와 Comparable
▶ Integer implements Comparable
▷ Integer, String, Float… 끼리 비교 가능
▷ Integer, String, Float… 이런 클래스들은 implements Comparable 이라서
public final class Integer extends Number implements Comparable { // Comparable은 기본 정렬 기준 제공, default
...
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));
}
...
}
Ch11 - 33. Integer와 Comparable 예제
▶ 버블 정렬
▷ int[], 오름차순 정렬
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;
// ② 자리 바꿈 : 불변
}
}
}
}
▷ Object[], Comparator
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++) {
int tmp = null;
// ① 두 대상 비교 : 불변
if (c.compare(objArr[j], objArr[j + 1] > 0) { // 정렬 기준 : 가변
tmp = objArr[j];
objArr[j] = objArr[j + 1];
objArr[j + 1] = tmp;
// ② 자리 바꿈 : 불변
}
}
}
}