Java - Comparable로 정렬(Sorting)하는 방법, Comparator와의 차이점

JS · 31 Oct 2019

Comparable은 인터페이스로, 이 인터페이스를 클래스가 구현하면 리스트 등을 정렬하는데 사용할 수 있습니다.

Comparable의 compareTo()메소드의 리턴 값은 음수, 양수, 0이 될 수 있습니다. 음수가 리턴되면 인자의 순서가 아래로 내려갑니다.

public interface Comparable<T> {
    public int compareTo(T o);
}

Comparable을 구현한 클래스

다음과 같이 Comparable를 구현한 클래스를 만들 수 있습니다. compareTo() 메소드를 오버라이드하면서 두개의 객체(this와 인자)를 비교하는 코드를 구현하면 됩니다.

public class Text implements Comparable<Text> {
    private String mText;

    public Text(String text) {
        mText = text;
    }

    public String getText() {
        return mText;
    }

    @Override
    public int compareTo(@NotNull Text right) {
        return getText().length() - right.getText().length();
    }
}

정렬 (sorting)

Collections.sort()에 Comparable 객체의 리스트를 인자로 전달하면 정렬을 합니다. 정렬하는 기준은 위에서 구현한 compareTo() 메소드입니다.

public void comparableExample1() {
    List<Text> texts = new ArrayList<>();
    texts.add(new Text("This code is free software"));
    texts.add(new Text("you can redistribute it"));
    texts.add(new Text("under the terms of the GNU General Public License version 2 only"));
    texts.add(new Text("This code is distributed in the hope that it will be useful"));
    texts.add(new Text("Please contact Oracle"));
    texts.add(new Text("500 Oracle Parkway, Redwood Shores, CA 94065 USA"));

    // Sorting 하기 전에 출력
    for (Text text : texts) {
        System.out.println(text.getText());
    }

    // 문자 길이로 sorting (오름차순)
    Collections.sort(texts);

    // sorting 후 출력
    System.out.println();
    for (Text text : texts) {
        System.out.println(text.getText());
    }
}

결과

This code is free software
you can redistribute it
under the terms of the GNU General Public License version 2 only
This code is distributed in the hope that it will be useful
Please contact Oracle
500 Oracle Parkway, Redwood Shores, CA 94065 USA

Please contact Oracle
you can redistribute it
This code is free software
500 Oracle Parkway, Redwood Shores, CA 94065 USA
This code is distributed in the hope that it will be useful
under the terms of the GNU General Public License version 2 only

Comparator와의 차이점

Comparator는 정렬에 대한 규칙을 갖고 있는 클래스입니다. compare()의 리턴 값은 음수, 양수, 0이 될 수 있습니다.

보통 한번만 사용하고 안쓰기 때문에 다음과 같이 익명 객체로 만듭니다.

List<String> strings = new ArrayList<>();
strings.add("This code is free software");
strings.add("you can redistribute it");
strings.add("under the terms of the GNU General Public License version 2 only");
strings.add("This code is distributed in the hope that it will be useful");
strings.add("Please contact Oracle");
strings.add("500 Oracle Parkway, Redwood Shores, CA 94065 USA");

Collections.sort(strings, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
});

결과

Please contact Oracle
you can redistribute it
This code is free software
500 Oracle Parkway, Redwood Shores, CA 94065 USA
This code is distributed in the hope that it will be useful
under the terms of the GNU General Public License version 2 only

조금 더 자세하 내용은 Java - Comparator로 정렬(Sorting)하는 방법를 참고해주세요.

참고

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha