从带有部分键的LinkedHashMap中获取值的Java方法

3

我有一个键值系统(HashMap),其中String将作为键,例如“2014/12/06”。

LinkedHashMap<String, Value>

所以,我可以通过键名检索到一个项目,但我要找的是一种方法来检索与部分键匹配的值列表,我的意思是,如何检索所有2014年的值?

我想避免像测试列表中的每个项目、暴力搜索或类似解决方案。

谢谢。


如果您经常需要以这种方式访问项目,则可能希望投资于MapFilter - OldCurmudgeon
4个回答

5
除了一个通过遍历所有键的暴力解决方案,我能想到两个选项:
  1. 使用TreeMap,在其中键已排序,因此可以找到第一个大于或等于“2014/01/01”的键(使用map.getCeilingEntry("2014/01/01")),然后从那里开始遍历所有键。

  2. 使用Map层次结构 - 即 Map<String,Map<String,Value>>。外部Map中的键将是年份。内部Map中的键将是完整日期。


Maps的层次结构似乎是一个非常好的解决方案,谢谢。 - Octal

0

仅使用LinkedHashMap不可能实现。如果您可以将键复制到有序列表中,则可以对其执行二进制搜索,然后使用完整的键调用LinkedHashMap.get(...)。


0
如果您只想使用键的第一部分来检索项目,那么您需要使用TreeMap而不是LinkedHashMapLinkedHashMap按插入顺序排序,这对此无用,但TreeMap按自然排序或您提供的Comparator排序。这意味着您可以高效地(在对数时间内)找到以2014开头的第一个条目,然后迭代直到找到第一个不匹配的条目。
如果您想匹配键的任何部分,则需要完全不同的解决方案,远远超出了简单的Map。您需要研究全文搜索和索引。您可以尝试像Lucene这样的东西。

0
你可以为你的值优化哈希函数,使得年份相似的值会散列到类似的前缀哈希中。这样做不够高效(可能会导致哈希分布不均匀),也不符合HashMap的精神。使用其他映射实现,如TreeMaps,可以按照你选择的顺序进行排序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接