【问题标题】:Java get values from LinkedHashMap with part of the keyJava 使用部分键从 LinkedHashMap 获取值
【发布时间】:2014-12-08 10:35:43
【问题描述】:
我有以下键值系统 (HashMap) ,其中 String 将是一个像“2014/12/06”这样的键。
LinkedHashMap<String, Value>
所以,我可以检索一个知道键的项目,但我正在寻找的是一种检索键匹配部分值的列表的方法,我的意思是,我如何检索 2014 年的所有值?
我想避免像测试列表中的每个项目、暴力破解或类似的解决方案。
谢谢。
【问题讨论】:
标签:
java
hashmap
key-value
linkedhashmap
【解决方案1】:
除了对所有键进行迭代的蛮力解决方案之外,我还可以想到两个选择:
使用 TreeMap,其中的键已排序,因此您可以找到 >= "2014/01/01" 的第一个键(使用 map.getCeilingEntry("2014/01/01"))并从那里遍历所有键。
使用地图的层次结构 - 即Map<String,Map<String,Value>>。外部地图中的关键是年份。内部地图中的关键是完整日期。
【解决方案2】:
仅使用 LinkedHashMap 是不可能的。如果您可以将键复制到有序列表,则可以对其执行二进制搜索,然后使用完整键执行 LinkedHashMap.get(...)。
【解决方案3】:
如果您只想使用键的第一部分检索项目,那么您需要TreeMap 而不是LinkedHashMap。 LinkedHashMap 是根据插入顺序排序的,这没有用,但是 TreeMap 是根据自然顺序排序的,或者你提供的 Comparator 排序。这意味着您可以有效地(在日志时间内)找到以2014 开头的第一个条目,然后遍历直到找到第一个不匹配的条目。
如果您希望能够匹配密钥的任何部分,那么您需要一个完全不同的解决方案,而不是简单的Map。您需要研究全文搜索和索引。你可以试试 Lucene 之类的东西。
【解决方案4】:
您可以为您的值优化散列函数,以便具有相似年份的值围绕相似的前缀散列散列。这既不高效(可能散列分布不佳)也不符合 HashMaps 的精神。使用其他地图实现,例如保持您选择的顺序的 TreeMaps。