Как получить список из набора и компаратора - PullRequest
12 голосов
/ 13 октября 2010

Что такое «хорошее» (и почему?) Решение для получения List из Set и сортировки по данному Comparator?

Ответы [ 5 ]

12 голосов
/ 13 октября 2010
Set<Object> set = new HashSet<Object>();

// add stuff

List<Object> list = new ArrayList<Object>(set);
Collections.sort(list, new MyComparator());
6 голосов
/ 13 октября 2010

Просто создай это. ArrayList имеет конструктор , который принимает другой Collection.

Set<Foo> set = new TreeSet<Foo>(new FooComparator<Foo>());
// Fill it.

List<Foo> list = new ArrayList<Foo>(set);
// Here's your list with items in the same order as the original set.
2 голосов
/ 13 октября 2010

Или:

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);
1 голос
/ 13 октября 2010

Предполагая, что вы начинаете с несортированного набора или набора, отсортированного в другом порядке, следующее, вероятно, наиболее эффективно, если вам требуется изменяемый список.

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.

0 голосов
/ 13 октября 2010

Вот как вы получаете List, когда у вас есть Set:

List list = new ArrayList(set);

Не уверен, что вы ожидаете сделать с Comparator.Если Set отсортировано, список будет содержать элементы в отсортированном порядке.

...