【问题标题】: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 年的所有值?

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

谢谢。

【问题讨论】:

  • 如果您经常需要以这种方式访问​​这些项目,那么您不妨投资MapFilter

标签: java hashmap key-value linkedhashmap


【解决方案1】:

除了对所有键进行迭代的蛮力解决方案之外,我还可以想到两个选择:

  1. 使用 TreeMap,其中的键已排序,因此您可以找到 >= "2014/01/01" 的第一个键(使用 map.getCeilingEntry("2014/01/01"))并从那里遍历所有键。

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

【讨论】:

  • 地图层次结构似乎是一个非常好的解决方案,谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您可以为您的值优化散列函数,以便具有相似年份的值围绕相似的前缀散列散列。这既不高效(可能散列分布不佳)也不符合 HashMaps 的精神。使用其他地图实现,例如保持您选择的顺序的 TreeMaps。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多