コンパレータを使って ArrayList をソートするという記事を読みましたが、どの例でも compareTo
が使われていましたが、調べてみるとこれは Strings 用のメソッドでした。
カスタムオブジェクトの ArrayList を、そのプロパティのひとつである Date オブジェクト(getStartDay()
)でソートしたいと思いました。
(getStartDay()
)です。通常は、item1.getStartDate().before(item2.getStartDate())
で比較しているので、次のように書けないかと考えていました。
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
Date][1]は[Comparable
]2を実装しているので、String
と同様にcompareTo
メソッドを持っています。
そのため、カスタムの[Comparator`][3]は以下のようになります。
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
compare()メソッドは
intを返さなければならないので、予定していたように
boolean`を直接返すことはできませんでした。
並べ替えのコードは、あなたが書いたようなものになるでしょう。
Collections.sort(Database.arrayList, new CustomComparator());
コンパレータを再利用する必要がない場合は、インラインの匿名クラスとして記述することで、もう少し短く書くことができます。
Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
最後の例では、Comparator
にラムダ式を使うことで、より短い形で書くことができます。
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
また、List
には [sort(Comparator)
][5] メソッドがあるので、さらに短くすることができます。
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
これは非常に一般的なイディオムで、キーが Comparable
であるクラスの Comparator
を生成する ビルトインメソッド があります。
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
これらはすべて同等の形式です。
[3]:[3]: //docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
[5]:抽出された結果は、次のようになりました: //docs.oracle.com/javase/8/docs/api/java/util/List.html#sort-java.util.Comparator-.
はい、できます。 アイテムの比較には、Comparable
この2つのインターフェースでは、それぞれ異なる動作が可能です。 Comparable では、先ほど Strings を説明したようにオブジェクトを動作させることができます(実際には String は Comparable を実装しています)。 もう1つのComparatorでは、先ほどのStringsのような動作をさせることができます。 次のようにします。
Collections.sort(myArrayList, new MyComparator());
これにより、Collections.sortメソッドは、ソートのメカニズムにコンパレータを使用します。 ArrayListのオブジェクトが比較可能なものを実装している場合は、代わりに次のようにすることができます。
Collections.sort(myArrayList);
コレクション]3クラスには、このような便利で一般的なツールが多数含まれています。