📅  最后修改于: 2023-12-03 14:42:15.218000             🧑  作者: Mango
在 Java 中,HashMap
是一个非常常用的数据结构,它可以快速地进行键值对的存取,是使用频率最高的集合之一。有时候我们需要根据 value
来获取 key
,那么该如何实现呢?
最简单的方法就是遍历 HashMap
,逐一比较每个 value
的值,如果匹配到了,就返回对应的 key
。这种方法的缺点是时间复杂度较高,不适用于大型数据。
public static <T, E> T getKeyByValue(Map<T, E> map, E value) {
for (Map.Entry<T, E> entry : map.entrySet()) {
if (value.equals(entry.getValue())) {
return entry.getKey();
}
}
return null;
}
双向 Map 是一种能够同时以键或者值为索引访问的 Map 实现。Guava 的 BiMap
就是这样的一个实现。我们可以使用 BiMap.inverse()
方法,让值变成键,键变成值,然后就可以直接获取到值对应的键了。
public static <K, V> K getKeyByValueBiMap(BiMap<K, V> map, V value) {
return map.inverse().get(value);
}
Java 8 引入了新的 Stream API,我们可以使用 entrySet().stream().filter()
方法来过滤出对应的 Entry
。然后我们可以通过 Optional
类型来避免 null
值的情况。
public static <K, V> K getKeyByValueStream(Map<K, V> map, V value) {
Optional<K> optional = map.entrySet()
.stream()
.filter(entry -> Objects.equals(entry.getValue(), value))
.map(Map.Entry::getKey)
.findFirst();
return optional.orElse(null);
}
使用以上三种方法,可以方便快捷地从 HashMap
中获取对应 value
的 key
。