Как отсортировать набор в список в Java? - PullRequest
161 голосов
/ 11 апреля 2009

В Java у меня есть Set, и я хочу превратить его в отсортированный List. Есть ли в пакете java.util.Collections метод, который сделает это для меня?

Ответы [ 9 ]

211 голосов
/ 11 апреля 2009

Ответ , предоставленный ОП , не самый лучший. Это неэффективно, так как создает новый List и ненужный новый массив. Кроме того, он вызывает «непроверенные» предупреждения из-за проблем безопасности типов вокруг универсальных массивов.

Вместо этого используйте что-то вроде этого:

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  java.util.Collections.sort(list);
  return list;
}

Вот пример использования:

Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);
71 голосов
/ 11 апреля 2009

Сортированный набор:

return new TreeSet(setIWantSorted);

или

return new ArrayList(new TreeSet(setIWantSorted));
43 голосов
/ 11 апреля 2009
List myList = new ArrayList(collection);
Collections.sort(myList);

... однако, добьемся цели. Добавьте ароматизаторы с помощью Generics, где это применимо.

38 голосов
/ 11 сентября 2014

Вот как вы можете сделать это с потоками Java 8:

mySet.stream().sorted().collect(Collectors.toList());

или с пользовательским компаратором:

mySet.stream().sorted(myComparator).collect(Collectors.toList());
9 голосов
/ 30 марта 2012

Всегда безопасно использовать интерфейс Comparator или Comparable для обеспечения реализации сортировки (если объект не является классами String или Wrapper для примитивных типов данных). В качестве примера реализации компаратора для сортировки сотрудников по имени

    List<Employees> empList = new LinkedList<Employees>(EmpSet);

    class EmployeeComparator implements Comparator<Employee> {

            public int compare(Employee e1, Employee e2) {
                return e1.getName().compareTo(e2.getName());
            }

        }

   Collections.sort(empList , new EmployeeComparator ());

Компаратор полезен, когда вам нужно иметь другой алгоритм сортировки для одного и того же объекта (например, имя emp, emp salary и т. Д.). Однорежимная сортировка может быть реализована с помощью сопоставимого интерфейса с требуемым объектом.

5 голосов
/ 11 апреля 2009

Нет единого способа сделать это. Используйте это:

@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
  T[] array = collection.toArray(
    (T[])new Comparable[collection.size()]);
  Arrays.sort(array);
  return Arrays.asList(array);
}
3 голосов
/ 11 июня 2010

Вы можете преобразовать набор в ArrayList, где вы можете отсортировать ArrayList, используя Collections.sort(List).

Вот код:

keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);     
Collections.sort(list);
2 голосов
/ 01 февраля 2018

@ Джереми Стейн Я хотел реализовать тот же код. Также я хотел отсортировать набор в список, поэтому вместо использования Set я преобразовал набор значений в список и отсортировал этот список по одной переменной. Этот код помог мне,

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());
2 голосов
/ 07 октября 2013
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

, где originalset = несортированный набор и list = список, который должен быть возвращен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...