【问题标题】:Sorted copy construction for ArrayListArrayList 的排序副本构造
【发布时间】:2012-09-25 10:55:57
【问题描述】:

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

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

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

【问题讨论】:

  • 假设您想要这些重复项,请使用选项 1。我没有更好的建议,除非您可以向我们提供有关其中包含的数据的更多详细信息。

标签: java list sorting collections arraylist


【解决方案1】:

在 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));

【讨论】:

  • s/asList/toList/
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    不要使用Treeset 来获取List 的排序副本。它将删除重复项。 (除非这是我们想要的,但这与创建 List 的新排序副本不同。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 2015-12-15
        • 2018-08-22
        • 1970-01-01
        相关资源
        最近更新 更多