Подтвердить что ты не робот

Сортировка с использованием интерфейса Comparator и потоков java 8

Родитель - это класс, который наследуется Child. который унаследован от GrandChild. Каждый класс содержит список дочернего класса (т.е. родительский элемент содержит список дочерних элементов, а дочерний элемент содержит список элементов GrandChild). Каждый класс содержит 50 атрибутов (attrib1-atrib50). getChildList() возвращает arrayList объектов типа Child getGrandChildList() возвращает arrayList объектов типа GrandChild

Пусть resultSet будет списком родителей

List<Parent> resultSet

Теперь я хочу отсортировать список на основе некоторых атрибутов. Например, если я хочу отсортировать resultSet на основе двух родительских атрибутов (скажем, атрибута 1 и атрибута 2, я использую этот код.

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

Теперь я хочу отсортировать родительский список на основе атрибута 1 класса Child и атрибута 1 класса GrandChild. Как я должен сортировать это.

4b9b3361

Ответ 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);