У 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
метод.
Завжди безпечно використовувати компаратор або порівняльний інтерфейс для забезпечення реалізації сортування (якщо об'єкт не є класами 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 ());
Компаратор корисний, коли вам потрібно мати різні алгоритми сортування на одному об’єкті (скажіть ім'я співпраці, заробітну плату тощо). Сортування в режимі одиночного режиму може бути здійснено за допомогою порівняльного інтерфейсу до потрібного об'єкта.
Не існує єдиного методу для цього. Використовуй це:
@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 = список, який потрібно повернути
@Jeremy Stein Я хотів реалізувати той самий код. Так само я хотів сортувати набір за списком, тож замість того, щоб використовувати Set, я перетворив задані значення у List та сортував цей список за однією змінною. Цей код мені допоміг,
set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());