我有一个ArrayList
.
如何List
用相同的数据实例化一个新的但排序的?
我想到了以下几点:
- 使用
ArrayList
复制构造函数,然后使用Collections.sort
- 用一个
TreeSet
对于选项 (1),复制元素然后排序会产生额外的开销。
对于选项 (2),将删除重复项。
最好的方法是什么?
我有一个ArrayList
.
如何List
用相同的数据实例化一个新的但排序的?
我想到了以下几点:
ArrayList
复制构造函数,然后使用Collections.sort
TreeSet
对于选项 (1),复制元素然后排序会产生额外的开销。
对于选项 (2),将删除重复项。
最好的方法是什么?
如果您可以使用第三方库,那么使用Guava这只是
List<Foo> sortedCopy = Ordering.from(comparator).sortedCopy(list);
(披露:我为 Guava 做出了贡献。)
“最佳方式”取决于您的要求:您要删除重复项吗?使用TreeSet
; 你想保留重复项吗?复制,然后排序。试图从两者中获得最快的一个是过早的优化。
在 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));
不要使用 aTreeset
来获取 a 的排序副本List
。它将删除重复项。(除非这是所需要的,但这与创建新的排序副本 a 是不同的问题List
)。
使用选项 1 - 创建一个新的List
并调用Collections.sort()
它,如果需要,可以使用你自己的Comparator
。