Comparator を使用して ArrayList をソートする方法について読みましたが、すべての例で使用されているcompareTo
のは、ある調査によると文字列用のメソッドです。
カスタム オブジェクトの ArrayList を、そのプロパティの 1 つである Date オブジェクト ( 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);
...
}
ベストアンサー1
以来Date
実装するComparable
、compareTo
と同じようなメソッドがありますString
。
あなたのカスタムComparator
次のようになります:
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());
}
});
以来java-8
最後の例を短く書くには、ラムダ式のためにComparator
:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
そしてList
、sort(Comparator)
メソッドなので、これをさらに短縮することができます。
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
これは非常に一般的な慣用句なので、組み込みメソッドComparator
キーを持つクラスのを生成するにはComparable
:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
これらはすべて同等の形式です。