List
从 a 中获取 aSet
并根据给定排序的“好”(为什么?)解决方案是Comparator
什么?
问问题
21613 次
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 回答