Java使用部分键从LinkedHashMap获取值
我有下面的键值系统(HashMap),其中字符串是一个类似“2014/12/06”的键Java使用部分键从LinkedHashMap获取值,java,hashmap,key-value,linkedhashmap,Java,Hashmap,Key Value,Linkedhashmap,我有下面的键值系统(HashMap),其中字符串是一个类似“2014/12/06”的键 LinkedHashMap 所以,我可以检索一个知道键的项,但我要找的是一个方法来检索键部分匹配的值的列表,我的意思是,我如何检索2014年的所有值 我希望避免像测试列表中的每个项目、暴力或类似的解决方案 谢谢。仅使用LinkedHashMap是不可能的。如果您可以将密钥复制到一个有序列表中,您可以对该列表执行二进制搜索,然后使用完整密钥执行LinkedHashMap.get(…)。除了执行遍历所有密钥的暴
LinkedHashMap
所以,我可以检索一个知道键的项,但我要找的是一个方法来检索键部分匹配的值的列表,我的意思是,我如何检索2014年的所有值
我希望避免像测试列表中的每个项目、暴力或类似的解决方案
谢谢。仅使用LinkedHashMap是不可能的。如果您可以将密钥复制到一个有序列表中,您可以对该列表执行二进制搜索,然后使用完整密钥执行LinkedHashMap.get(…)。除了执行遍历所有密钥的暴力解决方案外,我可以想到两个选项:
map.getCeilingEntry(“2014/01/01”)
),然后从那里检查所有键Map
。外部地图的关键是年份。内部地图中的关键是完整日期如果您只想使用键的第一部分检索项目,那么您需要的是
TreeMap
,而不是LinkedHashMap
。LinkedHashMap
是根据插入顺序排序的,这是没有用的,但是TreeMap
是根据自然顺序排序的,或者是根据您提供的比较器进行排序的。这意味着您可以高效地(在日志时间内)找到以2014
开头的第一个条目,然后迭代,直到找到第一个不匹配的条目
如果您希望能够匹配密钥的任何部分,那么您需要一个完全不同的解决方案,而不仅仅是一个简单的Map
。您需要研究全文搜索和索引。您可以尝试类似Lucene的方法。您可以为您的值优化哈希函数,以便具有类似年份的值将围绕类似前缀哈希进行哈希运算。这既不高效(可能散列分布不好),也不符合散列图的精神。使用其他地图实现,如树地图,它们会保持您选择的顺序。如果您经常需要以这种方式访问项目,那么您可能希望投资于一个地图。地图层次结构似乎是一个非常好的解决方案,谢谢。
LinkedHashMap<String, Value>