HashMap <string,integer =“”>搜索密钥的一部分?</string,>

时间:2013-05-21 07:51:53

标签: java search hashmap

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

9 个答案:

答案 0 :(得分:22)

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

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

如果您需要更高效的时间,那么您需要在跟踪这些部分密钥的地图实现。

答案 1 :(得分:4)

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

答案 2 :(得分:4)

它似乎是TreeMap而非HashMap的用例。区别在于TreeMap保留了顺序。所以你可以更快地找到你的部分匹配。您不必浏览整个地图。

检查此问题Partial search in HashMap

答案 3 :(得分:3)

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个字母键的所有键/值对。

答案 4 :(得分:1)

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

首先获取您的hashmap的条目集。遍历集合并检查每个密钥的长度并将其添加到地图中或根据需要使用它。

答案 5 :(得分:0)

使用HashMap<String, Integer>,您只能通过keySet()执行contains() String密钥和您的模式。

答案 6 :(得分:0)

例如:

public static void checkMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey().toLowerCase().contains("YourString"))
        }
}

对于包含keys

substring,此代码将打印为true

答案 7 :(得分:0)

正如已经指出的那样,对于您指定的数据结构,没有一种非常有效的方法。但是,如果您添加一个额外的Map<Integer, List<String>>来跟踪从字符串长度到具有该长度的所有键的列表的映射,那么您将能够非常有效地执行此操作。

*仅使用Map&lt; String,Integer&gt;,您需要遍历较大地图的整个容量,而添加此补充数据结构将强制执行O(1)查找(假设您使用了HashMap),然后迭代结果集,这是最快的结果。

答案 8 :(得分:0)

您可以尝试这种方法:

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;
    }