Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用部分键从LinkedHashMap获取值_Java_Hashmap_Key Value_Linkedhashmap - Fatal编程技术网

Java使用部分键从LinkedHashMap获取值

Java使用部分键从LinkedHashMap获取值,java,hashmap,key-value,linkedhashmap,Java,Hashmap,Key Value,Linkedhashmap,我有下面的键值系统(HashMap),其中字符串是一个类似“2014/12/06”的键 LinkedHashMap 所以,我可以检索一个知道键的项,但我要找的是一个方法来检索键部分匹配的值的列表,我的意思是,我如何检索2014年的所有值 我希望避免像测试列表中的每个项目、暴力或类似的解决方案 谢谢。仅使用LinkedHashMap是不可能的。如果您可以将密钥复制到一个有序列表中,您可以对该列表执行二进制搜索,然后使用完整密钥执行LinkedHashMap.get(…)。除了执行遍历所有密钥的暴

我有下面的键值系统(HashMap),其中字符串是一个类似“2014/12/06”的键

LinkedHashMap
所以,我可以检索一个知道键的项,但我要找的是一个方法来检索键部分匹配的值的列表,我的意思是,我如何检索2014年的所有值

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


谢谢。

仅使用LinkedHashMap是不可能的。如果您可以将密钥复制到一个有序列表中,您可以对该列表执行二进制搜索,然后使用完整密钥执行LinkedHashMap.get(…)。

除了执行遍历所有密钥的暴力解决方案外,我可以想到两个选项:

  • 使用一个树状图,其中键被排序,这样您可以找到第一个键>=“2014/01/01”(使用
    map.getCeilingEntry(“2014/01/01”)
    ),然后从那里检查所有键

  • 使用地图的层次结构-即
    Map
    。外部地图的关键是年份。内部地图中的关键是完整日期


  • 如果您只想使用键的第一部分检索项目,那么您需要的是
    TreeMap
    ,而不是
    LinkedHashMap
    LinkedHashMap
    是根据插入顺序排序的,这是没有用的,但是
    TreeMap
    是根据自然顺序排序的,或者是根据您提供的
    比较器进行排序的。这意味着您可以高效地(在日志时间内)找到以
    2014
    开头的第一个条目,然后迭代,直到找到第一个不匹配的条目


    如果您希望能够匹配密钥的任何部分,那么您需要一个完全不同的解决方案,而不仅仅是一个简单的
    Map
    。您需要研究全文搜索和索引。您可以尝试类似Lucene的方法。

    您可以为您的值优化哈希函数,以便具有类似年份的值将围绕类似前缀哈希进行哈希运算。这既不高效(可能散列分布不好),也不符合散列图的精神。使用其他地图实现,如树地图,它们会保持您选择的顺序。

    如果您经常需要以这种方式访问项目,那么您可能希望投资于一个地图。地图层次结构似乎是一个非常好的解决方案,谢谢。
    LinkedHashMap<String, Value>