In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-01-18 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Internet Technology >
Share
Shulou(Shulou.com)06/02 Report--
这篇文章主要介绍"java通过Value获取Map中的键值Key的方法有哪些",在日常操作中,相信很多人在java通过Value获取Map中的键值Key的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"java通过Value获取Map中的键值Key的方法有哪些"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1 简介
我们都知道Map是存放键值对的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值。然而,有的时候我们需要反过来获取,知道Value值,求Key值。
本文将用实例介绍四种方法,通过传入Value值,获取得到Key值。
2 四种方法2.1 循环法
循环法就是通过遍历Map里的Entry,一个个比较,把符合条件的找出来。会有三种情况:
(1)找到一个值
(2)找到多个值
(3)找不到
具体代码如下:
@Testpublic void loop() { Map 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 getKeyByLoop(Map map, V value) { for (Map.Entry entry : map.entrySet()) { if (Objects.equals(entry.getValue(), value)) { return entry.getKey(); } } return null;}private Set getKeysByLoop(Map map, V value) { Set set = Sets.newHashSet(); for (Map.Entry entry : map.entrySet()) { if (Objects.equals(entry.getValue(), value)) { set.add(entry.getKey()); } } return set;}
想特别说的一点是,在对比是否相等的时候,使用了Objects.equals(a, b)方法,而不是用a.equals(b)方法。这样可以避免空指针异常。
2.2 Stream方法
Stream总是在多种集合操作上都能提供优雅直观的方法,易写易理解。通过一个过滤器,即可把满足相等条件的值取出来,代码如下:
@Testpublic void stream() { Map map = ImmutableMap.of("A", 1, "B", 2, "C", 3, "D", 2); assertEquals(ImmutableSet.of("B", "D"), getKeysByStream(map, 2));}private Set getKeysByStream(Map map, V value) { return map.entrySet() .stream() .filter(kvEntry -> Objects.equals(kvEntry.getValue(), value)) .map(Map.Entry::getKey) .collect(Collectors.toSet());}2.3 Guava的BiMap
Google的Guava提供了BiMap这样一个双向Map,调用inverse()方法会返回一个反向的关联的BiMap,然后便可以通过get()方法获取key值了。
代码如下:
@Testpublic void guava() { BiMap 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是可以的。其实很好理解,因为是双向的,所以即要满足Key值的唯一性,也要满足Value值的唯一性。如果往里存放同样的Value,会抛异常:java.lang.IllegalArgumentException: value already present。
2.4 Apache Commons Collections的BidiMap
类似地,Apache Commons Collections也提供了双向Map的类BidiMap,它也是维持一对一的关系,不能多对一。它提供了getKey(value)方法返回Key值。代码如下:
@Testpublic void apacheCommons() { BidiMap bidiMap = new DualHashBidiMap(); bidiMap.put("A", 1); bidiMap.put("B", 2); bidiMap.put("C", null); bidiMap.put("D", 4); assertEquals("D", bidiMap.getKey(4));}
与Guava的BiMap不同的是,当存放同样的Value时,它不会抛异常,而是覆盖原有的数据。
3 总结
本文介绍了四种通过Value值获取Map中的Key值的方法,分别是循环法、Stream、Guava、Apache Commons Collections,这四种方法类似但不尽相同。
(1)循环法和使用Stram本质上都是要遍历的,如果一个Map经常需要反向取Key值,则不建议使用,可以考虑Guava和Apache Commons提供的双向Map;
(2)双向Map其实是一种空间换取时间的思想,虽然能较快的找到满足条件的Key值,但它也使用了更多的空间来储存双向Map;
(3)双向Map并不支持多对一的关系。
如何选择,就看具体需求来取舍了。
到此,关于"java通过Value获取Map中的键值Key的方法有哪些"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.