How get List from Set and Comparator

2019-04-19 20:05发布

问题:

What is the "good" (and why ?) solution to get a List from a Set and sorted against a given Comparator ?

回答1:

Set<Object> set = new HashSet<Object>();

// add stuff

List<Object> list = new ArrayList<Object>(set);
Collections.sort(list, new MyComparator());


回答2:

Just construct it. The ArrayList has a constructor taking another 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.


回答3:

Either:

Set<X> sortedSet = new TreeSet<X>(comparator); ...
List<X> list = new ArrayList<X>(sortedSet);

or:

Set<X> unsortedSet = new HashSet<X>(); ...
List<X> list = new ArrayList<X>(unsortedSet);
Collections.sort(list, comparator);


回答4:

Assuming that you start with an unsorted set or a set sorted on a different order, the following is probably the most efficient assuming that you require a modifiable List.

Set<T> unsortedSet = ... 
List<T> list = new ArrayList<T>(unsortedSet); 
Collections.sort(list, comparator);

If an unmodifiable List is acceptable, then the following is a bit faster:

Set<T> unsortedSet = ... 
T[] array = new T[unsortedSet.size()];
unsortedSet.toArray(array);
Arrays.sort(array, comparator);
List<T> list = Arrays.asList(array);

In the first version, Collections.sort(...) copies the list contents to an array, sorts the array, and copies the sorted elements back to the list. The second version is faster because it doesn't need to copy the sorted elements.

But to be honest the performance difference is probably not significant. Indeed, as the input set sizes get larger, the performance will be dominated by the O(NlogN) time to do the sorting. The copying steps are O(N) and will reduce in importance as N grows.



回答5:

This is how you get a List when you have a Set:

List list = new ArrayList(set);

Not sure what you expect to do with the Comparator. If the Set is sorted, the list will contain the elements in sorted order.