如何对Collection <T>进行排序?

Mer*_*cer 51 java sorting collections

我有一个通用的Collection,我试图找出如何排序其中包含的项目.我尝试了一些东西,但我不能让它们中的任何一个工作.

Ale*_*yak 68

集合本身没有预定义的顺序,因此您必须将它们转换为java.util.List.然后你可以使用一种形式java.util.Collections.sort

Collection< T > collection = ...;

List< T > list = new ArrayList< T >( collection );

Collections.sort( list );
 // or
Collections.sort( list, new Comparator< T >( ){...} );

// list now is sorted
Run Code Online (Sandbox Code Playgroud)

  • 虽然这解决了问题,但这不是最快的方法,除非集合本身已经是List. (3认同)
  • @Fortega:然后告诉我什么是对一般集合进行排序同时保留其所有元素的最快方法.顺便说一句,这正是Google Collections`Ordering.sortedCopy`使用的方法. (3认同)
  • @gwg - 你不能实例化`Collection`,它是一个抽象类.但是,您可以将任何扩展集合的内容分配给类型为"Collection"的局部变量. (2认同)

Mic*_*rdt 9

A Collection没有排序,所以想要对它进行排序没有意义.您可以对List实例和数组进行排序,并且执行此操作的方法是Collections.sort()Arrays.sort()


pol*_*nts 6

您有两个基本选项java.util.Collections:

根据具体Collection情况,你也可以看看SortedSetSortedMap.


For*_*ega 6

如果您的集合对象是一个列表,我将使用其他答案中提出的排序方法.

但是,如果它不是列表,并且您并不真正关心返回什么类型的Collection对象,我认为创建TreeSet而不是List更快:

TreeSet sortedSet = new TreeSet(myComparator);
sortedSet.addAll(myCollectionToBeSorted);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,仅当集合不包含重复项时,TreeSet才可行.此外,填充ArrayList然后对其进行排序比填充TreeSet更快.虽然两种方法都是O(N log N),但由于红黑树操作和大量内存分配,TreeSet具有更高的常数因子.尽管如此,我有时使用TreeSet来使我的代码更简洁,即使这比使用ArrayList慢. (2认同)

and*_*nka 5

你不能得到T.它必须由提供者注入:

Collection<T extends Comparable>
Run Code Online (Sandbox Code Playgroud)

或通过比较器

Collections.sort(...)
Run Code Online (Sandbox Code Playgroud)