在常量长度列表中插入对象 - Java

时间:2015-12-06 19:08:52

标签: java arraylist

我正在寻找一个很好的最佳策略来编写以下问题的代码。

我有一个对象列表。

  1. 对象在其他字段中具有字符串“评估”字段。估价字段可能是也可能不是唯一的。
  2. 列表是CONSTANT长度,在程序中计算。长度通常在100到500之间。
  3. 对象全部根据字符串字段 - 评估
  4. 在列表中排序
  5. 在找到或创建新对象时:将字符串字段评估与列表的现有成员进行比较。
  6. 如果比较失败,例如使用列表的底部成员,然后不将对象添加到列表中。
  7. 如果比较成功并且新的对象被添加到列表中 - 在排序条件内;新对象将添加到正确的位置,底部成员将从列表中删除,以使列表的长度保持不变。 / LI>

    我在想的一个策略:

    1. 继续将成员添加到列表中 - 直到达到maxLength
    2. 排序 - (例如带有比较器的Collections.sort)列表
    3. 创建新成员时 - 将其与列表的底部成员进行比较。
    4. 如果成功 - 替换底部成员,请继续
    5. 重新排序列表 - 如果成功
    6. 继续。

      程序循环了数百万次或更多次迭代,因此优化比较和运行已经成为一个问题。

      有关在Java域中解决此问题的良好策略的任何指导。哪些列表最有效,例如LinkedList或ArrayLists或Sets等哪种排序/插入(标准包)最有效?

2 个答案:

答案 0 :(得分:1)

考虑这个基于TreeSet的示例,并比较一个String for Results。如您所见,经过足够的迭代后,只有具有非常大键的元素才会保留在List中。在我相当旧的笔记本电脑上,我在不到50毫秒的时间内就拥有了10,000件物品 - 因此每百万个列表操作的响应数为5个。

<!-- //////////////////////////////////////////////////////////////////////////////// -->
<!-- // BEGIN Filters -->

<!-- Spring Security -->

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/**</url-pattern>
</filter-mapping>

<!-- // END FILTERS -->
<!-- //////////////////////////////////////////////////////////////////////////////// -->

答案 1 :(得分:0)

  

有关在Java域中解决此问题的良好策略的任何指导。

我的建议是 - 没有必要进行任何排序。在向集合中添加更多对象时,可以通过二进制插入来确保对数据进行排序。

这样,当你添加更多项时,集合本身已经是一个排序状态。

在第500项之后,如果要添加另一项,我们只需执行另一次二进制插入。插入性能始终保持在O(log(n)),并且不需要执行任何排序。

与您的算法比较

您的算法在1 - 4之间正常工作。但步骤5可能是您算法的瓶颈:

  

5.重新排序列表 - 如果成功

这是因为即使您的列表最多只有500个项目,但在添加第500个项目后,可以在此列表中执行无限次插入。

想象一下,再增加100万次插入和(在更糟糕的情况下),所有100万个项目“成功”并且可以插入到列表中,这意味着您的算法需要执行100万次排序! 这将是1 million * n(log(n))进行排序。

与二进制插入比较,在更糟糕的情况下,插入1 million * log(n)(无排序)。

  

哪些列表最有效,例如LinkedList或ArrayLists或Sets等。

如果使用ArrayList,则插入与链表相比效率不高,因为ArrayList由数组支持。但是,与链接列表(即O(n))相比,对于arrayList,元素的访问仅为O(1)。因此,没有一种对所有场景都有效的数据结构。您必须首先规划算法,看看哪种算法最适合您的策略。

  

哪种排序/插入(标准包装)最有效?

据我所知,有Arrays.sort()Collections.sort()可用,这将为您提供良好的O(n log(n))性能,因为它们使用的是双枢轴排序比自己创建的简单插入/冒泡/选择排序更有效。