Java从LinkedHashMap获取值,其中包含密钥的一部分

时间:2014-12-08 10:35:44

标签: java hashmap key-value linkedhashmap

我有以下键值系统(HashMap),其中String就是这样的键“2014/12/06”。

LinkedHashMap<String, Value>

所以,我可以检索一个知道密钥的项目,但我正在寻找的是一种方法来检索一个值的列表,哪个密钥匹配部分匹配,我的意思是,我怎样才能检索到2014年的所有值?

我想避免解决方案,例如测试列表中的每个项目,暴力破解或类似的。

感谢。

4 个答案:

答案 0 :(得分:5)

除了迭代所有键的蛮力解决方案之外,我还可以考虑两个选项:

  1. 使用TreeMap,其中键被排序,因此您可以找到第一个键&gt; =&#34; 2014/01/01&#34; (使用map.getCeilingEntry("2014/01/01"))并从那里查看所有密钥。

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

答案 1 :(得分:0)

仅限LinkedHashMap不可用。如果您可以将密钥复制到有序列表,则可以对其执行二进制搜索,然后使用完整密钥执行LinkedHashMap.get(...)。

答案 2 :(得分:0)

如果您只是想要使用密钥的第一部分来检索项目,那么您需要TreeMap而不是LinkedHashMapLinkedHashMap根据广告订单排序,对此无效,但TreeMap按照自然顺序排序,或者提供给您提供的Comparator。这意味着您可以有效地(在日志时间内)找到以2014开头的第一个条目,然后迭代直到您到达第一个不匹配的条目。

如果您希望能够匹配密钥的任何部分,那么您需要一个完全不同的解决方案,而不仅仅是简单的Map。您需要查看全文搜索和索引。你可以尝试像Lucene这样的东西。

答案 3 :(得分:0)

您可以为您的值优化哈希函数,以便具有相似年份的值会在类似的前缀哈希值周围散列。这不是有效的(可能是散列的差分),也不是HashMaps的精神。使用其他地图实现,例如TreeMaps,保持您选择的顺序。