Что такое "хорошее" (и почему?) решение, чтобы получить List
от Set
и отсортировано по сравнению с данным Comparator
?
Как получить список из набора и компаратора
Ответ 1
Set<Object> set = new HashSet<Object>();
// add stuff
List<Object> list = new ArrayList<Object>(set);
Collections.sort(list, new MyComparator());
Ответ 2
Просто постройте его. ArrayList
имеет конструктор который принимает другой Collection
.
Set<Foo> set = new TreeSet<Foo>(new FooComparator<Foo>());
// Fill it.
List<Foo> list = new ArrayList<Foo>(set);
// Here your list with items in the same order as the original set.
Ответ 3
Или:
Set<X> sortedSet = new TreeSet<X>(comparator); ...
List<X> list = new ArrayList<X>(sortedSet);
или
Set<X> unsortedSet = new HashSet<X>(); ...
List<X> list = new ArrayList<X>(unsortedSet);
Collections.sort(list, comparator);
Ответ 4
Предполагая, что вы начинаете с несортированного набора или набора, отсортированного в другом порядке, возможно, наиболее эффективным считается, что вам нужен модифицируемый список.
Set<T> unsortedSet = ...
List<T> list = new ArrayList<T>(unsortedSet);
Collections.sort(list, comparator);
Если неприменимый список допустим, то следующее немного быстрее:
Set<T> unsortedSet = ...
T[] array = new T[unsortedSet.size()];
unsortedSet.toArray(array);
Arrays.sort(array, comparator);
List<T> list = Arrays.asList(array);
В первой версии Collections.sort(...)
копирует содержимое списка в массив, сортирует массив и копирует отсортированные элементы обратно в список. Вторая версия выполняется быстрее, потому что нет необходимости копировать отсортированные элементы.
Но, честно говоря, разница в производительности, вероятно, невелика. Действительно, по мере увеличения размеров входных наборов производительность будет определяться временем O(NlogN)
для сортировки. Шаги копирования O(N)
и будут уменьшаться по мере возрастания N.
Ответ 5
Вот как вы получаете List
, когда у вас есть Set
:
List list = new ArrayList(set);
Не уверен, что вы ожидаете делать с Comparator
. Если сортировка Set
, список будет содержать элементы в отсортированном порядке.