web-dev-qa-db-fra.com

Tri à l'aide de l'interface de comparaison et Java 8 flux

Parent est une classe héritée par Child. qui est hérité par GrandChild. Chaque classe contient la liste de la classe enfant (c'est-à-dire que le parent contient la liste de l'enfant et l'enfant contient la liste de GrandChild). Chaque classe contient 50 attributs (attrib1-atrib50). getChildList () renvoie la arrayList des objets de type Child getGrandChildList () retourne la arrayList des objets de type GrandChild

Soit resultSet la liste des parents

List<Parent> resultSet

Maintenant, je veux trier la liste en fonction de certains attributs. Par exemple, si je veux trier resultSet en fonction de deux attributs parents (par exemple, attribut 1 et attribut 2, j'utilise ce code.

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());

Maintenant, je veux trier la liste des parents en fonction de l'attribut 1 de la classe Child et de l'attribut 1 de la classe GrandChild. Comment dois-je trier cela.

17
Manu Joy

Utilisation Comparator.comparing pour faire les comparateurs. Déterminez simplement ce que vous voulez comparer. Cela ressemblera à ceci, sauf que vous écrirez la logique que vous souhaitez utiliser pour extraire les valeurs à comparer:

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 rendrait également les exemples de votre question beaucoup plus agréables (en utilisant les importations statiques):

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