搜索LinkedHashMap,比顺序更快的方法?

时间:2013-08-08 01:16:05

标签: java iterator treemap linkedhashmap

我想知道是否有一种更有效的方法可以从LinkedHashMap中获取时间戳大于指定时间的对象。即比以下更好的东西:

    Iterator<Foo>  it = foo_map.values().iterator();
    Foo foo;

    while(it.hasNext()){
        foo = it.next();
        if(foo.get_timestamp() < minStamp) continue;

        break;
    }

在我的实现中,我的每个对象基本上都有三个值:“id”,“timestamp”和“data”。对象按其时间戳顺序插入,因此当我在集合上调用迭代器时,我得到有序结果(根据链接的hashmap合约的要求)。地图键入对象的id,因此我可以通过id快速查找它们。

然而,当我按时间戳条件查找它们时,我得到一个带有排序结果的迭代器。这是对通用散列映射的改进,但我仍需要在大部分范围内按顺序迭代,直到找到时间戳高于指定值的下一个条目。

由于结果已经排序,是否有任何算法可以传递迭代器(或集合),它可以比顺序搜索更快?如果我选择树形图作为替代方案,它会提供整体速度优势,还是在后台基本上做同样的事情?由于集合已按插入顺序排序,我认为树图有更多我不需要的开销?

1 个答案:

答案 0 :(得分:2)

没有更快的方法......如果你只使用LinkedHashMap

如果您想要更快的访问权限,则需要使用不同的数据结构。例如,带有适当比较器的TreeSet可能是解决问题这一方面的更好解决方案。例如,如果您的TreeSet按日期排序,那么使用适当的虚拟值调用tailSet可以为您提供大于或等于给定日期的所有元素。


  

由于结果已经排序,是否有任何算法可以通过迭代器(或集合),它可以比顺序搜索更快?

不适用于LinkedHashMap

但是,如果有序列表是ArrayList,那么您可以在列表中使用“二进制搜索”...前提是您可以锁定它以防止在搜索时进行并发修改。 (实际上,无论你如何实现这一点,并发性都是一个潜在的问题......包括你当前的线性搜索。)


如果你想保持id查找的能力,那么你需要两个数据结构;例如一个TreeSet和一个HashMap共享其元素对象。假设存在随机插入和/或随机删除,TreeSet可能比尝试维持ArrayList更有效。