从List
获取Set
并根据给定Comparator
排序的“好”(以及为什么?)解决方案是什么?
答案 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
已排序,则列表将按排序顺序包含元素。