HOME > java > utils

Java - Comparable로 정렬(Sorting)하는 방법

By 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

참고