4

我有一个ArrayList.
如何List用相同的数据实例化一个新的但排序的?
我想到了以下几点:

  1. 使用ArrayList复制构造函数,然后使用Collections.sort
  2. 用一个TreeSet

对于选项 (1),复制元素然后排序会产生额外的开销。
对于选项 (2),将删除重复项。
最好的方法是什么?

4

4 回答 4

9

如果您可以使用第三方库,那么使用Guava这只是

List<Foo> sortedCopy = Ordering.from(comparator).sortedCopy(list);

(披露:我为 Guava 做出了贡献。)

于 2012-10-04T15:50:14.853 回答
6

“最佳方式”取决于您的要求:您要删除重复项吗?使用TreeSet; 你想保留重复项吗?复制,然后排序。试图从两者中获得最快的一个是过早的优化。

于 2012-10-04T11:57:57.097 回答
5

在 Java 8 中,您可以使用流式传输:

ArrayList<Integer> myArrayList = new ArrayList();
myArrayList.add(4);
myArrayList.add(6);

List<Integer> myNewSortedList = myArrayList.stream().sorted().collect(Collectors.asList());

但是,上面的列表不能改变。如果您愿意,您可以改为收集为ArrayList

myArrayList<Integer> myNewSortedList = myArrayList.stream().sorted().collect(Collectors.toCollection(ArrayList::new));
于 2017-05-17T15:31:29.103 回答
3

不要使用 aTreeset来获取 a 的排序副本List。它将删除重复项。(除非这是所需要的,但这与创建新的排序副本 a 是不同的问题List)。

使用选项 1 - 创建一个新的List并调用Collections.sort()它,如果需要,可以使用你自己的Comparator

于 2012-10-04T12:24:33.153 回答