我需要检查地图是否包含列表中的任何键,如果是,则返回第一个匹配值。想到的天真方法是在两个嵌套循环中进行:
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标准库?
答案 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)
如果您假设地图的键已经是小写,则可以使用单个循环,就像您假设查找值是小写的一样。