【问题标题】:HashMap<String, Integer> Search for part of an key? [duplicate]HashMap<String, Integer> 搜索键的一部分? [复制]
【发布时间】:2013-05-15 21:55:29
【问题描述】:

我目前正在使用HashMap&lt;String, Integer&gt;,其中填充了String 类型的键,比如说,5 个字符长。如何搜索 4 个字符或更少的特定键,它是其他键的一部分和开头,并将所有命中作为 &lt;Key, Value&gt; 的集合?

【问题讨论】:

  • 您必须遍历所有 HashMap,使用 getKey.length() 并添加或不添加(取决于条件)到 List&lt;&gt;
  • 你看过keySet()吗?
  • 解决起来太难了,如果对你来说是,那么至少分享一下你到目前为止尝试过什么?
  • 您要查找的内容称为Trie
  • 问题:他正在寻找有 4 个字符而不是 5 个字符的条目?或者他正在寻找可能在 5 个字符以内的一系列 4 个字符?

标签: java search hashmap


【解决方案1】:

这似乎是 TreeMap 而不是 HashMap 的用例。不同之处在于 TreeMap 保留了顺序。因此,您可以更快地找到部分匹配项。您不必遍历整个地图。

检查这个问题Partial search in HashMap

【讨论】:

    【解决方案2】:

    迭代是您唯一的选择,除非您创建自定义数据结构:

    for (Entry<String, Integer> e : map.entrySet()) {
        if (e.getKey().startsWith("xxxx")) {
            //add to my result list
        }
    }
    

    如果您需要更节省时间的东西,那么您需要一个用于跟踪这些部分键的 map 实现。

    【讨论】:

      【解决方案3】:

      你可以试试这个方法:

      public Map<String,Integer> filterMap(Map<String, Integer> inputMap){
          Map<String, Integer> resultHashMap = new HashMap<String, Integer>();
              for (String key : inputMap.keySet()) {
                  if(key.length()==5){
                      resultHashMap.put(key,inputMap.get(key));
                  }   
              }
              return resultHashMap;
          }
      

      【讨论】:

        【解决方案4】:

        您不能通过HashMap 执行此操作,您应该为Map 编写自己的实现,以便在地图中实现基于字符串长度的搜索。

        【讨论】:

        • 当然,除非他改变要求,使用只有 4 个字符的键,并将其他数据存储在值中的对象中。另一种选择是使用自定义键对象,以及自定义 hashCode() 方法。
        • 我不建议滚动自己的地图。这可能是矫枉过正(此外,组合通常比继承更好)。但是,我同意数据结构按原样并非设计用于执行此操作。
        • 你不需要实现所有的 Map。如果你使用装饰器模式,添加额外的东西是很容易的。例如,我想注销添加到地图的每个键?好吧,我让我的 LoggingMap 实现 Map,然后你必须提供它要注销的 Map 的实际实例。在这种情况下,这会很好地工作,除了你会在列表中跟踪你想要的键或类似的东西,而不是记录。
        • 是的,对 Map 实现可以是 HashMap 或其他现有实现的扩展 (extends),仅覆盖所需的实现。我的观点是这个问题Map 似乎是一个正确的数据结构,但有一些修改过的get(用于基于长度的检索)和放置(为了获得最佳效果,再次说O(1))。由于所有其他答案都将外部逻辑显示为解决方案,因此拥有特定的 Map 将强制将该逻辑封装在地图本身内。
        【解决方案5】:

        如前所述,使用您指定的数据结构并没有一种非常有效的*方法。但是,如果您添加一个额外的Map&lt;Integer, List&lt;String&gt;&gt; 来跟踪从字符串长度到具有该长度的所有键列表的映射,那么您将能够非常有效地执行此操作。

        *仅使用 Map,您将需要遍历较大映射的整个容量,而添加此补充数据结构将强制执行 O(1) 查找(假设您使用了 HashMap),然后仅通过结果集进行迭代,这是可能的最快结果。

        【讨论】:

          【解决方案6】:
          Set<Entry<String, Integer>> s1 = map.entrySet();
              for (Entry<String, Integer> entry : s1) {
                    if(entry.getKey().length == 4)
                    //add it to a map;
          }
          

          首先将条目设置为您的哈希图。遍历集合并检查每个键的长度并将其添加到地图或根据需要使用它。

          【讨论】:

            【解决方案7】:
            Map<String, Integer> result = new HashMap<String, Integer>;
            for(String key : yourMap.keySet()) {
                if(key.length() == 4){
                    result.put(key, yourMap.get(key);
                }
            }
            

            执行此代码后,您在result 中拥有所有带有 4 个字母键的键/值对。

            【讨论】:

              【解决方案8】:

              使用HashMap&lt;String, Integer&gt;,您只能通过keySet() 并为String 键和您的模式执行contains()

              【讨论】:

                猜你喜欢
                • 2019-08-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-02-19
                • 2011-07-10
                • 1970-01-01
                • 2012-05-26
                相关资源
                最近更新 更多