Algorithm

[JAVA] Comparable로 Class 정렬하기(feat. CompareTo)

랩실외톨이 2022. 12. 19. 19:50
반응형

 

 

문제를 우리가 정의한 Class로 배열을 만들 때가 있다. 그리고 그걸 정렬해야 할 때가 있다. 하지만 일반적인 배열은 가지고 있는 값이 하나이기 때문에 정렬 기준이 오름차순이냐 내림차순이냐 밖에 없는데 우리가 정의한 Class는 그렇지 않다. 그래서 그냥 Arrays.sort나 Collections.sort를 돌리면 에러가 난다. 왜냐하면 정렬할 기준이 없기 때문이다. 그래서 우리는 Comparable interface를 통해서 기준을 만들어줘야 정렬할 수 있다.

 

ex)

 

Class Info implements Comparable<Info>{
    String name;
    int num;
    
    public Info(String name, int num) {
    	this.name = name;
        this.num = num;
    }
    
    @Override
    public int compareTo(Info o) {
    	if (this.name.equals(o.name)) return this.num - o.num;
        return this.name.compareTo(o.name);
    }
}

 

Info라는 Class를 선언했고, 정렬을 위해 기준을 만들어줬다.

 

compareTo함수는 Comparable interface에 정의된 함수를 사용하는 것이기 때문에 @Override를 달아줬다.

 

String은 문자열이기 때문에 비교를 할 때 equals를 사용해줬다. 숫자가 아니기 때문에 마찬가지로 크기를 비교하기 위해서는 compareTo를 사용해줬다. compareTo는 두 수의 차를 return 해준다고 한다.

 

this.num - o.num역시 같은 개념이다. 결국 두 수의 차가 앞의 것이 더 크면 양수, 같으면 0, 아니면 음수가 return 된다.

그 결과, this가 앞에오면 오름차순, o가 앞에오면 내림차순으로 정렬된다.

 

이를 정렬로 돌리면 name이 오름차순으로 정렬이 되고, name이 같은 경우에는 num의 오름차순으로 정렬된다.

 

이렇게 다양한 정렬의 기준을 세울 수 있는 편리한 함수이다.

 

But!!

 

내가 모르는 걸 수도 있지만... 한 Class에 두 개 이상의 여러 정렬 기준을 만들 수는 없다. (아니라면 어떻게 하는지 알려주세요,,, 제발)

만약 처음에 오름차순으로 정렬하고 어떤 작업을 한 후에 내림차순으로 정렬 기준을 바꾸고 싶다면? 그럴 수 없다는 뜻이다... (방법이 있으면 제발 댓글에 알려주세요)

하지만 위에처럼 다중 조건으로 정렬하는 것은 가능하다.

 

 

 

 

 

 

반응형