Primitive Type (기본 자료형)은 부등호를 사용하면 간단하게 비교할 수 있었다.
하지만 어떤 기준에 따라 객체를 비교하게 된다면 부등호를 사용할 수는 없다. 아래 문제와 같이 좌표상의 점의 x, y좌표를 기준으로 정렬해야하는 경우가 그렇다.
x좌표를 기준으로 오름차순 정렬하되 x좌표가 동일하다면 y좌표를 기준으로 오름차순 정렬하고자 한다.
이럴 때 사용하는 것이 Comparable Interface이다. 사용 방법은 다음과 같다.
- List 정렬 위한 Collections.sort(List)를 사용한다.
- 여러 필드를 가진 객체를 비교하기 위해 Comparable<Object> 를 implements 한다.
- 이후 compareTo를 Override 해 return 값으로 sort할 수 있도록 한다.
import java.util.*;
class Point implements Comparable<Point>{
public int x, y;
Point(int x, int y){
this.x = x;
this.y = y;
}
@Override
public int compareTo(Point object) {
if(object.x == this.x) return this.y - object.y;
else return this.x - object.x;
//내림차순은 obj-this
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
System.out.println("");
ArrayList<Point> pointArr = new ArrayList<>();
for(int i = 0; i < n; i++) {
int x = kb.nextInt();
int y = kb.nextInt();
pointArr.add(new Point(x, y));
}
Collections.sort(pointArr);
for(Point object : pointArr) System.out.println(object.x + " " + object.y);
}
}
Comparable Interface의 구현 클래스에서 구현해줘야 하는 메서드는 compareTo(T object) 이다. 이를 이용하여 자기 자신의 값과 parameter 객체의 값을 비교해 크기를 비교한다.
- this.x - object.x : 오름차순
- object.x - this.x = 내림차순
compareTo 인터페이스의 규칙
- 비교 대상인 객체(o)가 현재 객체(this)보다 작으면 음수를 반환한다.
- 비교 대상인 객체(o)가 현재 객체(this)보다 크면 양수를 반환한다.
- 비교 대상인 객체(o)가 현재 객체(this)와 같으면 0을 반환한다.
- 오름차순이다 = 작은 수에서 큰 수로 정렬된다
- 두 수의 차의 결과가 양수이면 자리를 바꾼다.
- 내림차순이다 = 작은 수에서 큰 수로 정렬된다
- 두 수의 차의 결과가 음수이면 자리를 바꾼다.
- { 1, 2 } 배열이 있다고 할 때 1 - 2 < 0 음수이다
- 오름차순이다 → 자리를 바꾸지 않는다.
- 내림차순이다 → 자리를 바꾼다.
- { 2, 1 } 배열이 있다고 할 때 2 - 1 > 0 양수이다
- 오름차순이다 → 자리를 바꾼다
- 내림차순이다 → 자리를 바꾸지 않는다.
Java에는 Comparable 인터페이스와 비슷한 Comparator 인터페이스도 존재한다. Comparator 인터페이스의 사용 방법과 이 둘의 차이에 대한 내용도 나중에 한 번 정리해 보려고 한다.
'[Java] > 문법, 자료구조, 알고리즘' 카테고리의 다른 글
== 와 .equals() 차이 (0) | 2023.03.28 |
---|---|
StringTokenizer (0) | 2023.03.25 |
Heap (0) | 2023.03.21 |
Stack / Queue (0) | 2023.03.20 |
Scanner vs BufferedReader (0) | 2023.03.16 |