カスタムオブジェクトのArrayListをプロパティでソート

コンパレータを使って 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 {
    @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() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
});

Since [tag:java-8].

最後の例では、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-.

解説 (12)

はい、できます。 アイテムの比較には、Comparableインターフェースと、Comparatorインターフェースの2つの選択肢があります。

この2つのインターフェースでは、それぞれ異なる動作が可能です。 Comparable では、先ほど Strings を説明したようにオブジェクトを動作させることができます(実際には String は Comparable を実装しています)。 もう1つのComparatorでは、先ほどのStringsのような動作をさせることができます。 次のようにします。

Collections.sort(myArrayList, new MyComparator());

これにより、Collections.sortメソッドは、ソートのメカニズムにコンパレータを使用します。 ArrayListのオブジェクトが比較可能なものを実装している場合は、代わりに次のようにすることができます。

Collections.sort(myArrayList);

コレクション]3クラスには、このような便利で一般的なツールが多数含まれています。

解説 (0)

カスタムComparatorクラスを使用するためには、java.util.Comparatorを実装する必要があります。 また、compare()とequals()をオーバーライドする必要があります。

compare()は次のような質問に答えなければなりません。 オブジェクト 1 はオブジェクト 2 より小さいか、同じか、大きいか?

完全なドキュメント: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html

解説 (0)