目次
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