如何从Set和Comparator获取List

时间:2010-10-13 12:10:10

标签: java list set comparator

List获取Set并根据给定Comparator排序的“好”(以及为什么?)解决方案是什么?

5 个答案:

答案 0 :(得分:12)

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

// add stuff

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

答案 1 :(得分:6)

构建它。 ArrayList有一个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.

答案 2 :(得分:2)

或者:

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);

答案 3 :(得分:1)

假设您从未排序的集合或以不同顺序排序的集合开始,假设您需要可修改的List,以下可能是最有效的。

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的增长,其重要性将降低。

答案 4 :(得分:0)

如果您拥有List

,则可获得Set
List list = new ArrayList(set);

不确定您对Comparator的期望。如果Set已排序,则列表将按排序顺序包含元素。