Comparable, Comparator는 둘다 객체를 비교하기 위해서 사용한다.
이 두 인터페이스를 사용한다면 우리가 원하는 기준을 만들어서 객체를 비교할 수 있게된다.
본질적으로 객체는 사용자가 기준을 정해주지 않는 이상 어떤 객체가 더 높은 우선순위를 갖는지 판단 할 수기 때문이다.
그렇다면 Comparable, Comparator 두개의 차이는 무엇일까?
Comparable은 "자기 자신과 매개변수 객체를 비교" 한다.
Comparator는 "두 매개변수 객체를 비교" 한다.
공식문서는 다음과 같다.
[Comparable]
docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#method.summary
[Comparator]
docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary
Comparable
interface Comparable
T자리에는 비교하고 싶은 객체의 타입이 들어가면 된다.
class Book implements Comparable<Book> {
int number;
int bookname;
Book(int number, int bookname) {
this.number = number;
this.bookname = bookname;
}
@Override
public int compareTo(Book o) {
// 자기자신의 number가 o의 number보다 크다면 양수
if(this.number > o.number) {
return 1;
}
// 자기 자신의 number와 o의 number가 같다면 0
else if(this.number == o.number) {
return 0;
}
// 자기 자신의 number가 o의 number보다 작다면 음수
else {
return -1;
}
}
}
이코드는 이렇게 간결하게 바꿀 수 있다.
Comparator
comparator는 두개의 인수를 받아서 비교할 수 있다.
코드는 아래와 같다.
public int compare(Book o1, Book o2) {
return o1.classNumber - o2.classNumber;
}
이때, comparator를 사용하기 위해서는 익명의 객체가 하나 더 필요하다.
테스트클래스에서 우리는 Book a 객체를 만들어서 a.compare(a,b) a.compare(b,c) 와 같은 형태로 사용해야 한다.
이를 방지하기 위해 익명 객체를 사용한다.
Comparator<Book> comp1 = new Comparator<Book>() {
@Override
public int compare(Book o1, Bookt o2) {
return o1.number - o2.number;
}
};
이렇게 하면 comp1.compare(a,b) 같은 식으로 코드를 활용할 수 있다.
정렬
이를 활용한 정렬 알고리즘을 짜보자.
두 수를 비교한 값이
음수일 경우 : 두 원소의 위치를 교환 안함
양수일 경우 : 두 원소의 위치를 교환 함
Arrays.sort()는 Comparator또한 파라미터로 받는다.
Arrays.sort(array, comp) 형식으로 작성하는게 가능하다는 것이다.
이를 활용해 이차원배열을 정렬해보았다.
우선 기준은 배열의 첫번째 원소로 잡고, 만약 첫번째 원소가 같다면 두번째 원소를 기준으로 정렬한다.
Arrays.sort(num, (o1, o2) -> {
if(o1[0] == o2[0]) {
return o1[1] - o2[1];
} else {
return o1[0] - o2[0];
}
});
'알고리즘 > 개념정리' 카테고리의 다른 글
서로소 집합 만들기 (1) | 2022.09.20 |
---|---|
순열, 조합 (0) | 2022.09.12 |
BFS,DFS (0) | 2022.08.11 |
객체 배열 (0) | 2022.08.09 |
Java 시간초과 날 때 (0) | 2022.08.03 |
댓글