查找map是否包含list / iterable中的任何键的有效方法

时间:2012-12-28 11:00:22

标签: java arrays dictionary iteration

我需要检查地图是否包含列表中的任何键,如果是,则返回第一个匹配值。想到的天真方法是在两个嵌套循环中进行:

Map<String, String> fields = new HashMap<String, String>();
fields.put("a", "value a");
fields.put("z", "value z");
String[] candidates = "a|b|c|d".split("|");
for (String key : fields.keySet()){
    for (String candidate : candidates) {
        if (key.equals(candidate)){
            return fields.get(key);
        }
    }
}

是否有更好,更有效的方法,可能依赖Java标准库?

9 个答案:

答案 0 :(得分:23)

for(String candidate : candidates) {
 if(fields.containsKey(candidate)) {
  return fields.get(candidate)
 }
}

如果null值可能在map中,并且只需要第一个检测到的键,则是最好的方法。

答案 1 :(得分:22)

肯定是这样的:

for (String candidate : candidates) {
     String result = fields.get(key);
     if (result != null) {
         return result;
     }
}

以上只针对每个候选键执行一次地图查找。它避免了对存在加提取的单独测试,因为提取不存在的键只会给你一个空值。注意(感谢 Slanec ),有效密钥的空值与此解决方案的不存在密钥无法区分。

我不太明白为什么你要进行大小写转换,顺便说一句。

答案 2 :(得分:7)

我的看法:

Map<String, String> fields = new HashMap<String, String>();
fields.put("a", "value a");
fields.put("z", "value z");
String[] candidates = "a|b|c|d".split("|");
for (String candidate : candidates) {
    if (fields.containsKey(candidate)) {
        return fields.get(candidate);
    }
}

答案 3 :(得分:6)

在Java 8中,您可以使用:

const [head, rest] = myArray;

答案 4 :(得分:6)

在Java 8中,您可以拥有:

boolean exists = Arrays.stream(candidates).anyMatch(fields::containsKey);

如果你只是想知道候选人是否是地图的关键。

如果你想知道第一个或任何你可以使用的:

Arrays.stream(candidates).filter(fields::containsKey).findAny();

Arrays.stream(candidates).filter(fields::containsKey).findFirst();

根据上面的@ Klapsa2503回答

答案 5 :(得分:5)

尝试

Set<String> keySet = new HashSet<String>(fields.keySet());    
keySet.retainAll(list);

所以keySet应该包含HashMap中列出的所有键

答案 6 :(得分:2)

尝试

    List list= Arrays.asList(1, 2, 3);
    HashMap map = new HashMap();
    map.put(1, 1);
    map.put(3, 3);
    Set set = new HashSet(map.keySet());
    set.retainAll(list);
    System.out.println(set);
    Object e = set.isEmpty() ? null : set.iterator().next();
    System.out.println(e);

输出

[1, 3]
1

答案 7 :(得分:1)

Map<String, String> fields = new HashMap<String, String>();
fields.put("a", "value a");
fields.put("z", "value z");
String[] candidates = "a|b|c|d".split("|");
List<String> canList = Arrays.asList(candidates );
for (String key : fields.keySet()){

if (canList .contains(key)) {
return fields.get(key);
}

}

答案 8 :(得分:1)

如果您假设地图的键已经是小写,则可以使用单个循环,就像您假设查找值是小写的一样。