如果我有值“foo”
,以及HashMap<;字符串>;ftw
对于其中的ftw.containsValue(“foo”)
返回true
,如何获取相应的密钥?我必须循环使用hashmap吗?最好的方法是什么
如果您的数据结构在键和值之间具有多对一映射,您应该迭代条目并选择所有合适的键:
公共静态<;T、 E>;设置<;T>;getKeysByValue(映射<;T,E>;映射,E值){
Set<;T>;keys=新哈希集<;T>;();
对于(条目<;T,E>;条目:map.entrySet()){
if(Objects.equals(value,entry.getValue())){
key.add(entry.getKey());
}
}
返回键;
}
如果是一对一关系,您可以返回第一个匹配的键:
公共静态<;T、 E>;T getKeyByValue(映射<;T,E>;映射,E值){
对于(条目<;T,E>;条目:map.entrySet()){
if(Objects.equals(value,entry.getValue())){
return entry.getKey();
}
}
返回null;
}
在Java 8中:
公共静态<;T、 E>;设置<;T>;getKeysByValue(映射<;T,E>;映射,E值){
return map.entrySet()
.stream()
.filter(entry->;Objects.equals(entry.getValue(),value))
.map(map.Entry::getKey)
.collect(收集器.toSet());
}
此外,对于Guava用户,BiMap可能有用。例如:
BiMap<;令牌、字符>;tokenToChar=
ImmutableBiMap.of(Token.LEFT_括号,“[”,Token.LEFT_括号,“(”);
Token-Token=tokenToChar.inverse().get('(');
字符c=tokenToChar.get(令牌);