Java

[Java] 객체 정렬 Comparable vs Comparator

sujin7837 2022. 2. 20. 22:42
반응형

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] Comparable와 Comparator의 차이와 사용법 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

반응형