カスタムオブジェクトのArrayListをプロパティで並べ替える 質問する

カスタムオブジェクトのArrayListをプロパティで並べ替える 質問する

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実装するComparablecompareToと同じようなメソッドがあります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());
    }
});

以来

最後の例を短く書くには、ラムダ式のためにComparator

Collections.sort(Database.arrayList, 
                        (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

そしてListsort(Comparator)メソッドなので、これをさらに短縮することができます。

Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));

これは非常に一般的な慣用句なので、組み込みメソッドComparatorキーを持つクラスのを生成するにはComparable:

Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));

これらはすべて同等の形式です。

おすすめ記事