1. ホーム
  2. java

[解決済み] カスタムオブジェクトのArrayListをプロパティでソートする

2022-03-18 18:44:01

質問

コンパレータを使った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);
    ...
}

解決方法は?

以来 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());
    }
});


以来 ジャバ・エイト

これで、最後の例を短く書くことができます。 ラムダ式 に対して 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));

これらはすべて等価な形式です。