map中如何根据value获取键值呢?
下文笔者讲述map中根据value"获取键值对象"的方法分享,如下所示
Map简介
我们都知道Map中存放键值对
由<Key,Value>一一存储
那么如何根据value获取键值对呢?
下文笔者将一一道来,如下所示
方式1:
循环法
方式2:
stream获取方法
方式3:
guava的BiMap法
方式4:
Apache Commons Collections的BidiMap
循环法
循环法通过遍历Map中的Entry 然后一个个比较 将符合条件数据的找出例
@Test
public void loop() {
Map<String, Integer> map = ImmutableMap.of("A", 1, "B", 2, "C", 3, "D", 2);
//找到一个值
assertEquals("A", getKeyByLoop(map, 1));
//找到多个值
assertEquals(ImmutableSet.of("B", "D"), getKeysByLoop(map, 2));
//找不到
assertEquals(null, getKeyByLoop(map, 4));
}
private <K, V> K getKeyByLoop(Map<K, V> map, V value) {
for (Map.Entry<K, V> entry : map.entrySet()) {
if (Objects.equals(entry.getValue(), value)) {
return entry.getKey();
}
}
return null;
}
private <K, V> Set<K> getKeysByLoop(Map<K, V> map, V value) {
Set<K> set = Sets.newHashSet();
for (Map.Entry<K, V> entry : map.entrySet()) {
if (Objects.equals(entry.getValue(), value)) {
set.add(entry.getKey());
}
}
return set;
}
Stream方法
Stream中 通过一个过滤器 即可将满足相等条件的值取出来例
@Test
public void stream() {
Map<String, Integer> map = ImmutableMap.of("A", 1, "B", 2, "C", 3, "D", 2);
assertEquals(ImmutableSet.of("B", "D"), getKeysByStream(map, 2));
}
private <K, V> Set<K> getKeysByStream(Map<K, V> map, V value) {
return map.entrySet()
.stream()
.filter(kvEntry -> Objects.equals(kvEntry.getValue(), value))
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
}
Guava中的BiMap方法
Google的Guava提供
BiMap这样一个双向Map
调用inverse()方法会返回一个反向的关联的BiMap
然后便可以通过get()方法获取key值
@Test
public void guava() {
BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("A", 1);
biMap.put("B", 2);
biMap.put("C", null);
biMap.put("D", 4);
assertEquals("D", biMap.inverse().get(4));
}
BiMap是一个双向Map
它不能存储多对一的关系
而HashMap是可以的
BiMap中Key值是唯一性
Value值也是唯一的
当向BiMap中放入同样Value,会抛异常:java.lang.IllegalArgumentException: value already present。
Apache Commons Collections的BidiMap
这也是一个双向Map 可使用getKey(value)方法返回key值例
@Test
public void apacheCommons() {
BidiMap<String, Integer> bidiMap = new DualHashBidiMap<>();
bidiMap.put("A", 1);
bidiMap.put("B", 2);
bidiMap.put("C", null);
bidiMap.put("D", 4);
assertEquals("D", bidiMap.getKey(4));
}
当我们放入相同的value时,原值会被覆盖
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


