我想知道是否有一种更有效的方法可以从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快速查找它们。
然而,当我按时间戳条件查找它们时,我得到一个带有排序结果的迭代器。这是对通用散列映射的改进,但我仍需要在大部分范围内按顺序迭代,直到找到时间戳高于指定值的下一个条目。
由于结果已经排序,是否有任何算法可以传递迭代器(或集合),它可以比顺序搜索更快?如果我选择树形图作为替代方案,它会提供整体速度优势,还是在后台基本上做同样的事情?由于集合已按插入顺序排序,我认为树图有更多我不需要的开销?
答案 0 :(得分:2)
没有更快的方法......如果你只使用LinkedHashMap
。
如果您想要更快的访问权限,则需要使用不同的数据结构。例如,带有适当比较器的TreeSet
可能是解决问题这一方面的更好解决方案。例如,如果您的TreeSet按日期排序,那么使用适当的虚拟值调用tailSet
可以为您提供大于或等于给定日期的所有元素。
由于结果已经排序,是否有任何算法可以通过迭代器(或集合),它可以比顺序搜索更快?
不适用于LinkedHashMap
。
但是,如果有序列表是ArrayList
,那么您可以在列表中使用“二进制搜索”...前提是您可以锁定它以防止在搜索时进行并发修改。 (实际上,无论你如何实现这一点,并发性都是一个潜在的问题......包括你当前的线性搜索。)
如果你想保持id
查找的能力,那么你需要两个数据结构;例如一个TreeSet
和一个HashMap
共享其元素对象。假设存在随机插入和/或随机删除,TreeSet
可能比尝试维持ArrayList
更有效。