親は、子によって継承されるクラスです。 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に基づいて親リストを並べ替えます。これをどのようにソートすればよいですか。
使用する 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);