Comparable Interface
정의
정렬 수행 시에 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의하는 인터페이스로, Java에서 제공되는 정렬이 가능한 모든 클래스들은 Comparable Interface를 구현하고 있습니다. 정렬 시에 이 기준에 맞게 정렬이 수행됩니다.
1) Integer, Double 클래스 : 오름차순 정렬
2) String 클래스 : 사전순 정렬
java.lang.Comparable
구현 방법
정렬할 객체에 Comparable Interface를 implements 후, compareTo() 메서드를 오버라이드하여 구현합니다.
compareTo() 메서드 작성법
- 현재 객체 < 파라미터로 넘어온 객체 : 음수 리턴
- 현재 객체 == 파라미터로 넘어온 객체 : 0 리턴
- 현재 객체 > 파라미터로 넘어온 객체 : 양수 리턴
값이 0이하인 경우에는 객체의 자리가 그대로 유지되고, 양수인 경우에는 두 객체의 자리가 바뀝니다.
Comparable Interface를 구현하였으면, sort를 이용하여 정렬을 수행할 수 있습니다.
// 정렬 기준
// 1. x좌표 증가하는 순
// 2. x좌표가 같으면 y좌표가 감소하는 순
class Point implements Comparable<Point> {
int x, y;
@Override
public int compareTo(Point p) {
if(this.x > p.x) return 1; // x에 대해서는 오름차순
else if(this.x == p.x) {
if(this.y < p.y) return 1;
}
return -1;
}
}
// main에서 사용
List<Point> list = new ArrayList<>();
list.add(new Point(1, 1));
list.add(new Point(1, 2));
list.add(new Point(3, 1));
Collections.sort(list);
// sort 결과
(1, 2), (1, 1), (3, 1)
Comparator Interface
정의
정렬 가능한 클래스(Comparable Interface를 구현한 클래스)들의 기본 정렬 기준과 다르게 정렬하고 싶을 때 사용하는 인터페이스입니다.
java.util.Comparator
구현 방법
Comparator Interface를 implements한 후, compare() 메서드를 오버라이드하여 작성합니다.
compare() 메서드 작성법
- 첫 번째 파라미터로 넘어온 객체 < 두 번째 파라미터로 넘어온 객체 : 음수 리턴
- 첫 번째 파라미터로 넘어온 객체 == 두 번째 파라미터로 넘어온 객체 : 0 리턴
- 첫 번째 파라미터로 넘어온 객체 > 두 번째 파라미터로 넘어온 객체 : 양수 리턴
음수 또는 0이면 객체의 자리가 그대로 유지되는 반면, 양수인 경우에는 두 객체의 자리가 변경됩니다.
Comparator Interface를 구현하였으면, sort를 이용하여 정렬을 수행할 수 있습니다.
// 정렬 기준
// 1. x좌표 증가하는 순
// 2. x좌표가 같으면 y좌표가 감소하는 순
class MadeByMe implements Comparator<Point> {
@Override
public int compare(Point p1, Point p2) {
if(p1.x > p2.x) return 1; // x에 대해 오름차순 정렬
else if(p1.x == p2.x) {
if(p1.y < p2.y) return 1;
}
return -1;
}
}
// main에서 사용
List<Point> list = new ArrayList<>();
list.add(new Point(1, 1));
list.add(new Point(1, 2));
list.add(new Point(3, 1));
MadeByMe madeByMe = new MadeByMe();
Collections.sort(list, madeByMe);
// sort 결과
(1, 2), (1, 1), (3, 1)
출처 : https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html
'Java' 카테고리의 다른 글
[Java] 데이터 직렬화(Serialization)와 역직렬화(Deserialization) (0) | 2022.02.20 |
---|---|
[Java] 싱글턴(Singleton) 디자인 패턴 (0) | 2022.02.20 |
[Java] 생성자와 초기화 (0) | 2022.02.18 |
[Java] 객체 지향 설계 5원칙_SOLID (0) | 2021.02.17 |
[Java] 자바가 확장한 객체 지향 (0) | 2021.02.17 |