我有以下键值系统(HashMap),其中String就是这样的键“2014/12/06”。
LinkedHashMap<String, Value>
所以,我可以检索一个知道密钥的项目,但我正在寻找的是一种方法来检索一个值的列表,哪个密钥匹配部分匹配,我的意思是,我怎样才能检索到2014年的所有值?
我想避免解决方案,例如测试列表中的每个项目,暴力破解或类似的。
感谢。
答案 0 :(得分:5)
除了迭代所有键的蛮力解决方案之外,我还可以考虑两个选项:
使用TreeMap,其中键被排序,因此您可以找到第一个键&gt; =&#34; 2014/01/01&#34; (使用map.getCeilingEntry("2014/01/01")
)并从那里查看所有密钥。
使用地图层次结构 - 即Map<String,Map<String,Value>>
。外部地图中的关键是年份。内部地图中的关键是完整日期。
答案 1 :(得分:0)
仅限LinkedHashMap不可用。如果您可以将密钥复制到有序列表,则可以对其执行二进制搜索,然后使用完整密钥执行LinkedHashMap.get(...)。
答案 2 :(得分:0)
如果您只是想要使用密钥的第一部分来检索项目,那么您需要TreeMap
而不是LinkedHashMap
。 LinkedHashMap
根据广告订单排序,对此无效,但TreeMap
按照自然顺序排序,或者提供给您提供的Comparator
。这意味着您可以有效地(在日志时间内)找到以2014
开头的第一个条目,然后迭代直到您到达第一个不匹配的条目。
如果您希望能够匹配密钥的任何部分,那么您需要一个完全不同的解决方案,而不仅仅是简单的Map
。您需要查看全文搜索和索引。你可以尝试像Lucene这样的东西。
答案 3 :(得分:0)
您可以为您的值优化哈希函数,以便具有相似年份的值会在类似的前缀哈希值周围散列。这不是有效的(可能是散列的差分),也不是HashMaps的精神。使用其他地图实现,例如TreeMaps,保持您选择的顺序。