🗝️요약 : Comparable 인터페이스 구현 메소드인 compareTo 에서 양수를 리턴하면 해당 클래스 객체는 뒤에 위치하게 되고 매개변수로 삽입된 클래스 객체는 앞에 위치하게 된다. 음수를 리턴하면 반대로 해당 클래스 객체는 앞에 위치하고 매개변수로 삽입된 클래스 객체는 뒤에 위치한다. 0은 순서를 바꾸지 않는다. Collections.sort()를 이용하여 compareTo 메소드를 사용한다.
양수 반환: 현재 객체(this)가 비교 대상 객체보다 크다는 것을 나타낸다. 따라서 정렬 시에 현재 객체(this)는 비교 대상 객체보다 뒤에 위치하게 된다.
음수 반환: 현재 객체(this)가 비교 대상 객체보다 작다는 것을 나타낸다. 따라서 정렬 시에 현재 객체(this)는 비교 대상 객체보다 앞에 위치하게 된다.
0 반환: 현재 객체(this)와 비교 대상 객체가 같다는 것을 나타낸다. 정렬 시에 순서를 변경하지 않는다.
Comparable 인터페이스를 구현하여 클래스를 작성하고 난 후 List와 같은 컬렉션에 구현한 클래스를 담아 Collections.sort()를 이용하여 여러 속성의 종류를 한꺼번에 정렬하고 있다.
import java.util.*;
class Jwapyo implements Comparable<Jwapyo>{
int x;
int y;
public Jwapyo(int x,int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Jwapyo j) {
if(j.x != x) return x - j.x;
else if(j.y != y) return y-j.y;
return 0;
}
}
public class Main {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int num = kb.nextInt();
List<Jwapyo> jwapyoList = new ArrayList<>(num);
for(int i=0;i<num;i++) {
int x = kb.nextInt();
int y = kb.nextInt();
jwapyoList.add(new Jwapyo(x,y));
}
Collections.sort(jwapyoList);
for(int i=0;i<num;i++) {
System.out.print(jwapyoList.get(i).x+" ");
System.out.println(jwapyoList.get(i).y);
}
}
}
이때 compareTo에 어떤 식으로 리턴해야 오름차순 혹은 내림차순으로 정렬될 지 헷갈리기 시작하였다.
CompareTo는 현재 객체 this와 비교 대상 객체(매개변수로 대입되는 객체) 비교할 때
- 오름차순 정렬 시 3,4,5...
양수 : 현재 객체가 비교 대상 객체보다 큼을 나타냄
음수 : 현재 객체가 비교 대상 객체보다 작음을 나타냄
0 : 현재 객체와 비교 대상 객체가 같음
로 정렬이 된다고 하는데 그렇다면
@Override
public int compareTo(Jwapyo j) {
if(this.x > j.x) return 1; // 현재 객체가 비교 대상 객체보다 큼을 나타냄
else if(this.x < j.x) return -1; // 현재 객체가 비교 대상 객체보다 작음을 나타냄
return 0; //현재 객체와 비교 대상 객체가 같음
}
가 기준에 맞게 작성된 것 같다.
this.x > j.x
일때 양수를 리턴하는데 오름차순이므로 j.x, this.x 이 순서로 정렬될 것이다.
this.x = 4, j.x = 3 일때 오름차순 정렬
if(this.x > j.x) return 1;
이므로 3,4 이 순서로 정렬이 된다. 양수로 리턴 되면 현재 클래스에 저장된 객체가 보다 뒤에 위치하게 된다.
만약 if(this.x > j.x) return -1;//(음수 리턴)
이렇게 된다고 가정하면 내림차순이 될 것이다.
-> 4,3
this.x가 크지만 반대로 -1을 리턴하므로 this.x는 작다는 것처럼 되어 뒤쪽으로 배치된다. 그러므로
-> 3,4
와 같은 결과가 나오게 된다.
class Body implements Comparable<Body>{
int x;
int y;
Body(int x,int y){
this.x = x;
this.x = y;
}
@Override
public int compareTo(Body o) {
// x를 먼저 비교하고, x가 같다면 y를 비교
if(this.x != o.x) return this.x - o.x;
return o.y - this.y;
}
}
return this.x - o.x;
와 같은 것은 처음 적용하고자 할때 오름차순인지 내림차순인지 헷갈린다.
return this.x - o.x;
가 양수이면 this.x(객체에 저장된 값) 를 뒤에 배치하고 음수이면 o.x(매개변수로 대입된 객체의 값)를 뒤에 배치하게 될 것이다.
결국 this.x 가 양수이면(값이 더 크면) 뒤에 배치되도록 하는 오름차순으로 정렬되는 것이다.