Comparatorで並び替えを行う時の昇順・降順についての検証

Comparatorで並び替えを行う時の昇順・降順についての検証

Comparator<sortTarget>で並び替えを行う時の昇順・降順についての検証

List型のソートを行う時などに使うComparatorの並び替えの挙動があいまいだったので整理します。

事前準備

対象クラスを作っておく

@Getter
@Setter
public class sortTarget {
        private String name;
        private int key;
}

List型に以下の文字列と整数の組み合わせで格納します。

List<sortTarget> list = Arrays.asList(
                parent.new sortTarget("a", 1),
                parent.new sortTarget("b", 2),
                parent.new sortTarget("c", 3),
                parent.new sortTarget("d", 4),
                parent.new sortTarget("e", 5));

検証

.compareTo

ソートクラス

public class sort1 implements Comparator<sortTarget> {

    @Override
    public int compare(sortTarget o1, sortTarget o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

実行後

System.out.println("★sort1★");
Collections.sort(list, parent.new sort1());
list.stream().map(sortTarget::getName).forEach(System.out::println);
★sort1★
a
b
c
d
e

.compareTo(逆)

ソートクラス

public class sort2 implements Comparator<sortTarget> {

    @Override
    public int compare(sortTarget o1, sortTarget o2) {
        return o2.getName().compareTo(o1.getName());
    }
}

実行後

System.out.println("★sort2★");
Collections.sort(list, parent.new sort2());
list.stream().map(sortTarget::getName).forEach(System.out::println);
★sort2★
e
d
c
b
a

引き算

ソートクラス

public class sort3 implements Comparator<sortTarget> {

    @Override
    public int compare(sortTarget o1, sortTarget o2) {
        return o1.getKey() - o2.getKey();
    }
}

実行後

System.out.println("★sort3★");
Collections.sort(list, parent.new sort3());
list.stream().map(sortTarget::getName).forEach(System.out::println);
★sort3★
a
b
c
d
e

引き算(逆)

ソートクラス

public class sort4 implements Comparator<sortTarget> {

    @Override
    public int compare(sortTarget o1, sortTarget o2) {
        return o2.getKey() - o1.getKey();
    }
}

実行後

System.out.println("★sort4★");
Collections.sort(list, parent.new sort4());
list.stream().map(sortTarget::getName).forEach(System.out::println);
★sort4★
e
d
c
b
a

まとめ

o1.compareTo(o2)は文字列の自然順序で昇順を行う。(その実態は文字コードによる並び替えをしている)
o2.compareTo(o1)は文字列の自然順序で降順を行う。(その実態は文字コードによる並び替えをしている)
o1 – o2は整数の昇順を行う。
o2 – o1は整数の降順を行う。

ソースはgithubに公開してます
sorted_compareTo

プログラミングカテゴリの最新記事