20

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

4

8 回答 8

30

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

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

如果您需要更节省时间的东西,那么您需要一个地图实现,您可以在其中跟踪这些部分键。

于 2013-05-21T07:55:14.090 回答
6

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

检查这个问题Partial search in HashMap

于 2013-05-21T07:58:03.173 回答
4

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

于 2013-05-21T07:54:14.520 回答
3
Map<String, Integer> result = new HashMap<String, Integer>;
for(String key : yourMap.keySet()) {
    if(key.length() == 4){
        result.put(key, yourMap.get(key);
    }
}

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

于 2013-05-21T07:56:04.993 回答
1
Set<Entry<String, Integer>> s1 = map.entrySet();
    for (Entry<String, Integer> entry : s1) {
          if(entry.getKey().length == 4)
          //add it to a map;
}

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

于 2013-05-21T07:57:40.547 回答
0

HashMap<String, Integer>您一起只能通过键和模式进行keySet()操作contains()String

于 2013-05-21T07:54:09.323 回答
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;
    }
于 2013-05-21T08:02:19.210 回答
0

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

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

于 2013-05-21T07:59:59.970 回答