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

JS · 31 Oct 2019

Comparator 객체를 생성하여 Collections나 배열 등을 정렬할 수 있습니다.

Comparator는 다음 두가지 방법으로 만들 수 있습니다.

  1. 익명 클래스
  2. 람다식

익명 클래스로 Comparator 생성

익명클래스로 Comparator를 생성할 수 있습니다. compare()의 리턴 값은 음수, 양수, 0이 될 수 있습니다. 음수가 리턴되면 오른쪽 인자가 아래로 내려갑니다.

public void comparatorExample1() {
    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");

    // Sorting 하기 전에 출력
    for (String str : strings) {
        System.out.println(str);
    }

    // 문자 길이로 sorting (오름차순)
    Collections.sort(strings, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return s1.length() - s2.length();
        }
    });

    // sorting 후 출력
    System.out.println();
    for (String str : strings) {
        System.out.println(str);
    }
}

결과

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

람다식(Lambda)으로 Comparator 생성

익명 클래스는 람다식으로 표현할 수도 있습니다.

public void comparatorExample2() {
    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");

    // Sorting 하기 전에 출력
    for (String str : strings) {
        System.out.println(str);
    }

    // 문자 길이로 sorting (오름차순)
    Collections.sort(strings, (s1, s2) -> s1.length() - s2.length());

    // sorting 후 출력
    System.out.println();
    for (String str : strings) {
        System.out.println(str);
    }
}

결과

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

Comparable과 차이점

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

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

다음과 같이 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();
    }
}

그리고 다음과 같이 Collections.sort()를 호출하여 정렬할 수 있습니다.

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());
    }
}

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

참고

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