web-dev-qa-db-ja.com

Comparator InterfaceおよびJava 8 Streamsを使用したソート

親は、子によって継承されるクラスです。 GrandChildに継承されます。各クラスには子クラスのリストが含まれます(つまり、親には子のリストが含まれ、子にはGrandChildのリストが含まれます)。各クラスには50個の属性(attrib1-atrib50)が含まれます。 getChildList()は、ChildタイプのオブジェクトのarrayListを返しますgetGrandChildList()は、GrandChildタイプのオブジェクトのarrayListを返します

ResultSetを親のリストとする

List<Parent> resultSet

次に、いくつかの属性に基づいてリストを並べ替えます。たとえば、2つの親属性(たとえば、属性1と属性2)に基づいてresultSetを並べ替える場合、このコードを使用します。

Comparator<Parent> byFirst = (e1, e2) -> e2.getAttrib1().compareTo(e1.getAttrib1());
Comparator<Parent> bySecond = (e1, e2) -> e1.getAttrib2().compareTo(e2.getAttrib2());

Comparator<Parent> byThird = byFirst.thenComparing(bySecond);


List<Parent> sortedList = resultSet.stream().sorted(byThird).collect(Collectors.toList());

ここで、Childクラスの属性1とGrandChildクラスの属性1に基づいて親リストを並べ替えます。これをどのようにソートすればよいですか。

17
Manu Joy

使用する Comparator.comparingコンパレーターを作成します。比較したいものを見つけてください。比較する値を抽出するために使用するロジックを作成する場合を除き、次のようになります。

Comparator<Parent> byAttr1ofFirstChild = Comparator.comparing(
    parent -> parent.getChildren().get(0).getAttr1()
);

Comparator<Parent> byAttr1ofFirstGrandChild = Comparator.comparing(
    parent -> parent.getChildren().get(0).getGrandChildren().get(0).getAttr1()
);


List<Parent> sortedList = parents.stream()
    .sorted(byAttr1ofFirstChild.thenComparing(byAttr1ofFirstGrandChild))
    .collect(toList());

Comparator.comparingはまた、あなたの質問の例をより良くします(静的インポートを使用):

Comparator<Parent> byFirst = comparing(Parent::getAttrib1, reverseOrder());
Comparator<Parent> bySecond = comparing(Parent::getAttrib2);
28
Misha