12

List从 a 中获取 aSet并根据给定排序的“好”(为什么?)解决方案是Comparator什么?

4

5 回答 5

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

// add stuff

List<Object> list = new ArrayList<Object>(set);
Collections.sort(list, new MyComparator());
于 2010-10-13T12:14:47.010 回答
6

只需构建它。有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.
于 2010-10-13T12:12:27.143 回答
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);
于 2010-10-13T12:24:10.337 回答
1

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

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

如果一个不可修改的 List 是可以接受的,那么下面会更快一点:

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)排序的时间。随着 N 的增长,复制步骤的O(N)重要性将会降低。

于 2010-10-13T13:26:34.910 回答
0

List当您拥有 a 时,这就是您获得 a的方式Set

List list = new ArrayList(set);

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

于 2010-10-13T12:12:29.180 回答