В Java у меня есть Set
, и я хочу превратить его в отсортированный List
. Есть ли в java.util.Collections
пакете метод , который сделает это для меня?
В Java у меня есть Set
, и я хочу превратить его в отсортированный List
. Есть ли в java.util.Collections
пакете метод , который сделает это для меня?
Ответы:
Ответ, предоставленный ФП , не самый лучший. Это неэффективно, так как создает новые 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);
Util
класс содержит asSortedList()
метод, который я написал. Другими словами, вы Util
сами пишете класс и помещаете в него этот код.
Сортированный набор:
return new TreeSet(setIWantSorted);
или:
return new ArrayList(new TreeSet(setIWantSorted));
Set
?
new TreeSet
принимает Collection
s, а не только Set
s. Не каждый, кто читает этот ответ, будет использовать Set
, хотя это то, что задает оригинальный вопрос.
List myList = new ArrayList(collection);
Collections.sort(myList);
... должен сделать свое дело однако. Добавьте аромат с Generics, где это применимо.
Comparable
и переопределить compareTo
метод.
Всегда безопасно использовать интерфейс 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, имя зарплаты и т. Д.). Однорежимная сортировка может быть реализована с помощью сопоставимого интерфейса с требуемым объектом.
Там нет единого способа сделать это. Использовать это:
@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);
}
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);
list.addAll(sortedset);
где originalset = несортированный набор и list = список, который нужно вернуть
@ Джереми Стейн Я хотел реализовать тот же код. Также я хотел отсортировать набор в список, поэтому вместо использования Set я конвертировал набор значений в список и сортировал этот список по одной переменной. Этот код помог мне,
set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());