If I have the value "foo"
, and a HashMap<String> ftw
for which ftw.containsValue("foo")
returns true
, how can I get the corresponding key?我必须遍历哈希图吗?最好的方法是什么?
原文由 Nick Heiner 发布,翻译遵循 CC BY-SA 4.0 许可协议
If I have the value "foo"
, and a HashMap<String> ftw
for which ftw.containsValue("foo")
returns true
, how can I get the corresponding key?我必须遍历哈希图吗?最好的方法是什么?
原文由 Nick Heiner 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您的数据结构在键和值之间具有 多对一 映射,您应该遍历条目并选择所有合适的键:
public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
Set<T> keys = new HashSet<T>();
for (Entry<T, E> entry : map.entrySet()) {
if (Objects.equals(value, entry.getValue())) {
keys.add(entry.getKey());
}
}
return keys;
}
在 一对一 关系的情况下,您可以返回第一个匹配的键:
public static <T, E> T getKeyByValue(Map<T, E> map, E value) {
for (Entry<T, E> entry : map.entrySet()) {
if (Objects.equals(value, entry.getValue())) {
return entry.getKey();
}
}
return null;
}
在 Java 8 中:
public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
return map.entrySet()
.stream()
.filter(entry -> Objects.equals(entry.getValue(), value))
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
}
此外,对于 Guava 用户, BiMap 可能会有用。例如:
BiMap<Token, Character> tokenToChar =
ImmutableBiMap.of(Token.LEFT_BRACKET, '[', Token.LEFT_PARENTHESIS, '(');
Token token = tokenToChar.inverse().get('(');
Character c = tokenToChar.get(token);
原文由 Vitalii Fedorenko 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.3k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
如果您选择使用 Commons Collections 库 而不是标准的 Java Collections 框架,您可以轻松实现这一点。
Collections 库中的
BidiMap
接口是双向映射,允许您将键映射到值(如法线映射),也可以将值映射到键,从而允许您执行双向查找。getKey()
方法支持获取值的键。但有一个警告,双向映射不能将多个值映射到键,因此除非您的数据集在键和值之间具有 1:1 映射,否则您不能使用双向映射。
如果要依赖 Java Collections API,则必须在将值插入映射时确保键和值之间的 1:1 关系。这说起来容易做起来难。
一旦可以确保,使用
entrySet()
方法获取 Map 中的条目集(映射)。获得类型为Map.Entry
的集合后,遍历条目,将 存储值 与预期值进行比较,并获得 相应的 key 。可以在 Google Guava 和重构的 Commons-Collections 库(后者不是 Apache 项目)中找到对具有 泛型 的双向地图的支持。感谢 Esko 指出 Apache Commons Collections 中缺少的通用支持。将集合与泛型一起使用可以使代码更易于维护。
从 4.0 版开始,官方 Apache Commons Collections™ 库支持 泛型。
请参阅“ org.apache.commons.collections4.bidimap ”包的 摘要 页面,了解
BidiMap
、OrderedBidiMap
和SortedBidiMap
接口的可用实现列表现在支持 Java _泛型_。