【发布时间】:2011-02-09 07:17:19
【问题描述】:
我正在为 java 寻找一个好的排序列表。谷歌搜索给了我一些关于使用 TreeSet/TreeMap 的提示。但是这些组件缺少一件事:随机访问集合中的一个元素。 例如,我想访问排序集中的第 n 个元素,但使用 TreeSet,我必须遍历其他 n-1 个元素才能到达那里。这将是一种浪费,因为我的 Set 中有多达数千个元素。
基本上,我正在寻找类似于 .NET 中排序列表的东西,能够快速添加元素、快速删除元素以及随机访问列表中的任何元素。
这种排序列表在某处实现了吗? 谢谢。
已编辑
我对 SortedList 的兴趣源于以下问题: 我需要维护一个包含数千个对象的列表(并且可以增长到数十万个)。这些对象将被持久化到数据库中。我想从整个列表中随机选择几十个元素。因此,我尝试维护一个单独的内存列表,其中包含所有对象的主键(长数字)。当从数据库中添加/删除对象时,我需要从列表中添加/删除键。我现在正在使用 ArrayList,但是当记录数量增加时,恐怕 ArrayList 不适合它。 (想象一下,每次从数据库中删除对象时,您都必须迭代数十万个元素)。回到我做 .NET 编程的时候,然后我会使用排序列表(List 是一个 .NET 类,一旦 Sorted 属性设置为 true,将保持其元素的顺序,并提供有助于删除/插入元素的二进制搜索很快)。我希望我能从 java BCL 中找到一些类似的东西,但不幸的是,我没有找到一个好的匹配。
【问题讨论】:
-
TreeSet 为您提供 log(n) 查找,而不是线性的。
-
@Stefan: TreeSet 为您提供 log(n)
contains测试(其中 n 是大小),但无法轻松访问第 i 个元素(其中 i 是任意索引) . -
不,不会!这就是重点,如果您愿意阅读我所说的话。这将需要 20 * log_2(4000) = 20*~12 = 240 次迭代。这在现代硬件上是可以忽略的!
-
@Stefan:感谢预优化的警告。实际上,我现在正在使用没有排序的 ArrayList。 (因为,我实际上不需要排序。我只需要排序以更快地添加、删除元素)。但如果有一个优化的解决方案,为什么不去适应它呢?我相信解决方案应该已经存在(因为 .NET 已经有很长一段时间了,所以我猜 Java 也应该有它)。
-
我不确定 .NET 是否有这个。
List没有 Sort 或 Sorted 属性。它确实有一个 Sort 方法。这与您在此处要求的行为不同(这与 JavaCollections.sort方法没有什么不同)。即使在 .NET 中,保持排序列表也不会缩短删除时间。