public interface Comparator {
// 결과 : 0(같음), 양수(왼쪽이 큰 것), 음수(오른쪽이 큰 것)
int compare(Object o1, Object o2); // o1, o2 두 객체를 비교
boolean equals(Object obj); // equals를 오버라이딩 하라는 뜻
}
public interface Comparable {
int compareTo (Object o); // 주어진 객체를 자신(this)과 비교
}
public final class Integer extends Number implements Comparable {
...
public int compareTo(Integer anotherInteger) {
int v1 = this.value;
int v2 = anotherInteger.value;
// 같으면 0, 오른쪽 값이 크면 -1, 작으면 1을 반환
return (v1 < v2 ? -1 : (v1 == v2 ? 0 : 1));
}
...
}
Integer Class에서 두 숫자의 차이로 어느쪽이 큰지 비교할 수 있지만, 삼항연산자를 사용한 이유
compare()와 compareTo()는 두 객체의 비교결과를 반환하도록 작성
7 5 -> 5 7
5 7 -> 7 5
Comparator 인터페이스를 구현한 기준
을 넣어줘야 함static void sort(Object[] a) // 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
static void sort(Object[] a, Comparator c) // 지정한 Comparator에 의한 정렬
import java.util.*;
class Ex11_7 {
public static void main(String[] args) {
String[] strArr = {"cat", "Dog", "lion", "tiger"};
Arrays.sort(strArr); // Case 1 : String의 Comparable 구현에 의한 정렬 (기본 사전순 정렬 구현되어 있음)
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // Case 2 : 대소문자 구분 안함
Arrays.sort(strArr, new Descending()); // Case 3 : 역순 정렬
}
}
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.comparableTo(c2) * -1; // -1을 곱해서 기본 정렬방식의 역으로 변경
// 또는 C2.comparableTo(c1)으로 순서를 바꿔도 된다
}
}
Arrays.sort(strArr);
o1-o2
: 정렬 알고리즘은 o1-o2가 양수라면(o1이 더 큰것) 큰 수를 뒤로 보낸다고 판단o2-o1
: o2 - o1 이 양수라면(o2가 더 큰것), 큰 수를 앞에 둔다고 판단뒤에 나옴
앞에 나옴
// o1 : 2 , o2 : 6 => o2 - o1 > 0 -> 첫 번째 인자가 큰 것으로 인식되어 첫번째 수인 o1이 뒤에 나옴
// 따라서 [6, 2] 순서로 정렬됨
list.stream()
.sort(o1, o2 -> o2 - o1)
...
// 음악 2개 이상이라면 재생 횟수가 많은 순으로 정렬 후 삽입, 같을 경우 인덱스 낮은 순
List<Integer> sortedList = list.stream()
.sorted((o1, o2) -> {
int play1 = plays[o1];
int play2 = plays[o2];
if (play1 == play2) {
// 재생 횟수가 같은 경우, 인덱스가 낮은 노래가 먼저 오도록 변경
return o1 - o2;
} else if (play1 < play2) {
// 양수 반환 : 첫 번째 인자가 두번째 인자보다 큼을 의미(왼 > 오)
// 항상 큰것이 뒤로 가게 정렬되기 때문에 왼쪽꺼가 뒤로 가짐
// Comparator : 양수일 경우 첫번째가 뒤에 나옴
return 1;
}
// play1 > play2
else {
// 음수 반환 : 첫 번째 인자가 두번째 인자보다 작음을 의미(왼 < 오)
// 첫번째 인자가 항상 작으니 첫번째꺼가 앞에옴
// Comparator : 음수일 경우 첫번째가 앞에 나옴
return -1;
}
}
)
.collect(Collectors.toList());