Java 如何从集合和比较器获取列表

Java 如何从集合和比较器获取列表,java,list,set,comparator,Java,List,Set,Comparator,从集合中获取列表并根据给定的比较器进行排序的“好”(为什么?)解决方案是什么?只需构建它即可。ArrayList有一个 Set Set=newtreeset(newfoopcomparator()); //填满它。 列表=新的ArrayList(集合); //这是您的列表,其中项目的顺序与原始设置相同。 这是当您有一个集合时,如何获得列表的方法: List list = new ArrayList(set); 不确定您希望使用比较器执行什么操作。如果对Set进行排序,列表将按排序顺序包含元素。

集合
中获取
列表并根据给定的
比较器进行排序的“好”(为什么?)解决方案是什么?

只需构建它即可。
ArrayList
有一个

Set Set=newtreeset(newfoopcomparator());
//填满它。
列表=新的ArrayList(集合);
//这是您的列表,其中项目的顺序与原始设置相同。

这是当您有一个
集合时,如何获得
列表的方法:

List list = new ArrayList(set);
不确定您希望使用
比较器执行什么操作。如果对
Set
进行排序,列表将按排序顺序包含元素。

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

// add stuff

List<Object> list = new ArrayList<Object>(set);
Collections.sort(list, new MyComparator());
//添加内容 列表=新的ArrayList(集合); Collections.sort(list,new MyComparator());
以下任一项:

Set<X> sortedSet = new TreeSet<X>(comparator); ...
List<X> list = new ArrayList<X>(sortedSet);
Set sortedSet=新树集(比较器)。。。
List List=新阵列列表(sortedSet);
或:

Set unsortedSet=new HashSet()。。。
列表列表=新的ArrayList(未排序集);
集合。排序(列表、比较);

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

Set<T> unsortedSet = ... 
List<T> list = new ArrayList<T>(unsortedSet); 
Collections.sort(list, comparator);
Set unsortedSet=。。。
列表列表=新的ArrayList(未排序集);
集合。排序(列表、比较);
如果不可修改的列表是可接受的,那么以下内容会快一点:

Set<T> unsortedSet = ... 
T[] array = new T[unsortedSet.size()];
unsortedSet.toArray(array);
Arrays.sort(array, comparator);
List<T> list = Arrays.asList(array);
Set unsortedSet=。。。
T[]数组=新的T[unsortedSet.size()];
未排序集到阵列(阵列);
排序(数组、比较器);
列表=数组。asList(数组);
在第一个版本中,
Collections.sort(…)
将列表内容复制到数组中,对数组进行排序,然后将排序后的元素复制回列表中。第二个版本更快,因为它不需要复制已排序的元素


但老实说,性能差异可能并不显著。实际上,随着输入集大小的增大,性能将由执行排序的
O(NlogN)
时间决定。复制步骤是
O(N)
,并且随着N的增加,其重要性将降低。

这个问题尚不清楚。例如,我可以通过忽略比较器从集合和比较器中获取列表。这是一个“好”的解决方案。。。从某种意义上说,它比使用比较器的解决方案要快。@Stephen我更新了我的问题您确定需要列表吗?也许一个SortedSet就可以了。只是在那之后添加了COllections.sort()。回答错误,这将不起作用,因为ArrayList构造函数不排序任何内容,您甚至还没有使用比较器,所以它将如何排序?使用Collections.sort()或TreeSet,就像在其他答案中一样。已修复答案以包含对排序的调用。显然,他希望使用comparator获得排序列表,这意味着集合未排序。你还想用比较仪做什么?因此,他应该通过排序集进行排序,或者在填充列表后对列表进行排序。@Christoff Hammarström-或者在/通过逐个插入元素进行排序:插入排序。@Ishtar:我的第一个建议是,如果通过排序集进行排序,会发生这种情况。使用Arrays.sort的版本实际上没有太多优化(甚至没有优化),因为Collections.sort()已经包含类似的代码:Object[]a=list.toArray();排序(a,(比较器)c);ListIterator i=list.ListIterator();对于(int j=0;j@iirekm-使用
数组。asList(array)
避免了使用列表迭代器执行复制。啊,这种额外的复制可能只对非常大的数据集很重要。@iirekm-是的。但是正如我所提到的,由于N变得非常大,排序成本占了复制成本的主导地位。
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);