【发布时间】:2015-12-06 19:08:51
【问题描述】:
我正在寻找一个很好的最佳策略来为以下问题编写代码。
我有一个对象列表。
- 对象在其他字段中有一个字符串“评估”字段。估值字段可能是唯一的,也可能不是唯一的。
- 列表的长度是在程序中计算的。长度通常在 100 到 500 之间。
- 对象都根据字符串字段在列表中排序 - 估值
- 发现或创建新对象时:将字符串字段估值与列表的现有成员进行比较。
- 如果比较失败,例如使用列表的底部成员,则该对象不会添加到列表中。
- 如果比较成功并且新对象被添加到列表中 - 在排序标准内;新对象被添加到正确的位置并且底部成员被从列表中移除以保持列表的长度不变。
我正在考虑的一个策略:
- 继续向列表中添加成员 - 直到达到 maxLength
- 排序 - (例如,带有比较器的 Collections.sort)列表
- 创建新成员时 - 将其与列表底部的成员进行比较。
- 如果成功 - 替换底部成员,否则继续
- 重新排序列表 - 如果成功
然后继续。
程序循环百万次以上,优化比较和运行成为问题。
任何关于在 Java 域中解决此问题的好策略的指南。哪些列表将是最有效的,例如LinkedList 或 ArrayLists 或 Sets 等。哪种排序/插入(标准包)最有效?
【问题讨论】:
-
估值是否唯一?我会说使用 TreeMap 或 TreeSet 作为实现的基础。这样搜索速度很快,插入也很好。
-
@Jan.. 不,估值可能是唯一的,也可能不是唯一的。即如果等于底部成员,则 - 不要添加。我也更新了问题。
-
Still TreeSet 可能是最佳选择 - 但您需要快速比较器。
-
感谢 @ Jan。在这里阅读 Treeset link 的一些很好的例子。这个链接也有比较和比较器的一个很好的例子。 “快速比较器”是什么意思?
-
啊,从头到尾。无论如何,您都会比较字符串。因此,就性能而言,没有什么大不了的。