Сортировать набор элементов по полю - PullRequest
0 голосов
/ 02 июня 2018

У меня есть set A объектов из того же класса, и у каждого из них есть поле Enum, которое comparable.Как я могу отсортировать набор по этому полю?я думал о чем-то вроде:

Collections.sort(A, enumField)

, но, конечно же, enumField - это не объект для сравнения ...

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Вы можете использовать Comparator#comparing в сочетании с Stream

Set<T> sorted = set.stream()
                   .sorted(Comparator.comparing(A::getEnumField))
                   .collect(Collectors.toCollection(LinkedHashSet::new))

Нам нужно сохранить порядок, поэтому сбор до LinkedHashSet.Однако это будет работать, только если вы не планируете добавлять какие-либо дополнительные элементы в набор.Лучшая альтернатива - использовать TreeSet

Set sorted  = new TreeSet<>(Comparator.comparing(A::getEnumField))));
sorted.addAll(set); 
0 голосов
/ 02 июня 2018

Вы не можете отсортировать Set с Collections.sort, поскольку он потребляет только List<T>.

. Вместо этого вы можете сделать свой набор TreeSet с помощью предоставленного компаратора:

Set<A> mySet = new TreeSet<>(Comparator.comparing(A::getEnumField));

означает, что элементы будут отсортированы по мере добавления.

или, если у вас нет контроля над изменением набора, в котором уже есть элементы, вы можете использовать потоковый API, собирая в TreeSet с вышеупомянутым компаратором, который затем выдает новый TreeSet с отсортированными элементами.

Set<A> sortedSet = mySet.stream()
                     .collect(Collectors.toCollection(() ->
                        new TreeSet<>(Comparator.comparing(A::getEnumField))));
0 голосов
/ 02 июня 2018

Collections.sort не принимает Set.Он принимает только List с, поэтому сначала вы должны преобразовать свой набор в список:

ArrayList<YourObject> list = new ArrayList<>(yourSet);

Затем вы можете вызвать Collections.sort с помощью специального компаратора:

Collections.sort(list, Comparator.comparing(x -> x.enumField));
// now "list" contains the sorted elements.
...