map中如何根据value获取键值呢?

乔欣 Java经验 发布时间:2023-03-10 22:04:18 阅读数:3701 1
下文笔者讲述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时,原值会被覆盖
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202303/16784578995998.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者