java不断排序列表,快速检索

时间:2011-09-07 13:14:43

标签: java sortedlist

我在java中寻找一个不断排序的列表,它也可以用来非常快速地检索一个对象。 PriorityQueue非常适合“经常排序”的要求,HashMap非常适合按键快速检索,但我需要在同一个列表中。有一次我写了自己的,但它没有实现集合接口(所以不能用作java.util.List等的替代品),我宁愿坚持标准的java类如果可能的话。

那里有这样的清单吗?现在我使用2个列表,一个优先级队列和一个hashmap,两者都包含相同的对象。我使用优先级队列按排序顺序遍历列表的第一部分,通过键快速检索的哈希映射(我需要互换地执行这两个操作),但我希望有一个更优雅的解决方案......

编辑:我应该补充一点,我需要让列表按不同的比较器排序,然后用于按键检索;列表按长值排序,密钥检索是字符串。

6 个答案:

答案 0 :(得分:2)

由于您已经在使用HashMap,这意味着您拥有唯一的密钥。假设您想按这些键订购,TreeMap就是您的答案。

答案 1 :(得分:2)

听起来你正在谈论的是一个具有自动维护索引的集合。

尝试查看使用“list pipelines”的GlazedLists来有效地传播更改 - 他们的SortedList类应该完成这项工作。

编辑:错过了按键检索的要求。这可以使用GlazedLists.syncEventListToMapGlazedLists.syncEventListToMultimap来完成 - 如果没有重复键,syncEventListToMap可以工作,如果有重复键,syncEventListToMultimap可以工作。关于这种方法的好处是你可以根据不同的索引创建多个地图。


如果你想使用TreeMaps作为索引 - 这可能会给你带来更好的性能 - 你需要将TreeMaps私密地封装在你选择的自定义类中,公开你想要的接口/方法,并创建访问器/该类的mutators使索引与集合保持同步。如果从多个线程访问集合,请务必处理并发问题(通过synchronized方法或锁或其他)。


编辑:最后,如果以排序顺序快速遍历项目很重要,请考虑使用ConcurrentSkipListMap而不是TreeMap - 不是因为它的并发性,而是因为它的快速遍历。 Skip lists是链接列表,具有多个级别的链接,一个遍历所有项目,下一个遍历每个K项目(对于给定的常量K),下一个遍历每个K 2 平均项目等。

答案 2 :(得分:1)

答案 3 :(得分:0)

使用TreeSet

  

基于TreeMap的NavigableSet实现。元素按照它们的自然顺序排序,或者在创建时创建时提供的比较器,具体取决于使用的构造函数。

     

此实现为基本操作(添加,删除和包含)提供了有保证的log(n)时间成本。

答案 4 :(得分:0)

我没有对此进行测试,所以我可能错了,所以请考虑这只是一次尝试。 使用TreeMap,将此映射的键包装为具有两个属性的对象(您在hashmap中用作键的字符串和用于在PriorityQueue中维护排序顺序的long)。现在,对于此对象,使用字符串覆盖equals和hashcode方法。使用long实现类似的接口。

答案 5 :(得分:0)

为什么不将解决方案封装到实现Collection或Map的类中? 这样,您可以简单地将检索方法委托给更快/更好的适合集合。只需确保对write-methods(add / remove / put)的调用将被转发到两个集合。记住间接访问,比如iterator.remove()。大多数这些方法都是可选的,但你必须停用它们(在大多数情况下,Collections.unmodifiableXXX会有所帮助)。