カスタムオブジェクトの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);
...
}
1090
3
Date
][1]は[Comparable
]2を実装しているので、String
と同様にcompareTo
メソッドを持っています。そのため、カスタムの[Comparator`][3]は以下のようになります。
compare()
メソッドは
intを返さなければならないので、予定していたように
boolean`を直接返すことはできませんでした。並べ替えのコードは、あなたが書いたようなものになるでしょう。
コンパレータを再利用する必要がない場合は、インラインの匿名クラスとして記述することで、もう少し短く書くことができます。
Since [tag:java-8].
最後の例では、
Comparator
にラムダ式を使うことで、より短い形で書くことができます。また、
List
には [sort(Comparator)
][5] メソッドがあるので、さらに短くすることができます。これは非常に一般的なイディオムで、キーが
Comparable
であるクラスのComparator
を生成する ビルトインメソッド があります。これらはすべて同等の形式です。
[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インターフェースと、Comparatorインターフェースの2つの選択肢があります。
この2つのインターフェースでは、それぞれ異なる動作が可能です。 Comparable では、先ほど Strings を説明したようにオブジェクトを動作させることができます(実際には String は Comparable を実装しています)。 もう1つのComparatorでは、先ほどのStringsのような動作をさせることができます。 次のようにします。
これにより、Collections.sortメソッドは、ソートのメカニズムにコンパレータを使用します。 ArrayListのオブジェクトが比較可能なものを実装している場合は、代わりに次のようにすることができます。
コレクション]3クラスには、このような便利で一般的なツールが多数含まれています。
カスタムComparatorクラスを使用するためには、java.util.Comparatorを実装する必要があります。 また、compare()とequals()をオーバーライドする必要があります。
compare()は次のような質問に答えなければなりません。 オブジェクト 1 はオブジェクト 2 より小さいか、同じか、大きいか?
完全なドキュメント: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html