目次
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
コメントを書く