【问题标题】:What is the most efficient way (speed-wise) of maintaining a sorted ArrayList in Java?在 Java 中维护排序的 ArrayList 的最有效方法(速度方面)是什么?
【发布时间】:2016-01-18 00:36:36
【问题描述】:

以下两种方法中哪一种是保持ArrayList 排序更快的方法?

  • 在其位置插入元素
  • 拨打push,然后拨打Collections.sort(myList)

【问题讨论】:

  • 取决于您使用它的目的,SortedSet ?
  • 我想要一个用户列表(这是一个单独的类),其 id 必须按升序排列。这里我以整数为例,以免使问题复杂化
  • 我认为 smonff 的答案是最有意义的:不要围绕固定的数据结构构建接口。相反,请选择能够满足您需求的数据结构;无需在其周围构建额外的层。
  • 我是 Java 新手,这是我能想到的最佳方法。谢谢您的回答

标签: java sorting arraylist collections


【解决方案1】:

有不同种类的集合。你可以choose one that keeps your data sorted

【讨论】:

  • 如果操作需要随机访问,我认为 JDK 没有提供排序的替代方案...
【解决方案2】:

在正确的位置插入可能会更有效,例如使用Collections.binarySearch(list, elementToInsert)

int index = Collections.binarySearch(list, element);
if (index < 0) index = - (index + 1);
list.add(index, element);

如果您不需要随机访问并且您的条目是唯一的(根据您的评论似乎就是这种情况),您也可以使用 TreeSet:

NaivigableSet<User> users = new TreeSet<> (Comparator.comparing(User::getId));

集合将始终根据必须唯一的用户 ID 进行排序。

【讨论】:

  • 如果我使用你的方法,我的User 类将不得不实现Comparable&lt;User&gt;Comparator&lt;User&gt;,对吧?
  • @gusteru 在第一个示例中是的,但如果需要,您可以提供自己的比较器:Collections.binarySearch(list, element, Comparator.comparing(User::getId))。在我的第二个示例中,我已经提供了一个基于 id 的比较器,因此在这种情况下不需要 User 是 Comparable 的。
【解决方案3】:

如果您的要求要求在每次插入后进行连续排序,我认为您应该尝试替代方法而不是当前方法,因为这本身并不省时。有关可能的解决方案的详细解释,您必须查看Sorted array list in Java

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 2016-03-20
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多