JAVA 通过value获取Map中key的三种方法
JAVA 通过value获取Map中key的三种方法
- 简介
- 方法描述
- 循环法
- Stream方法
- Apache Commons Collections的BidiMap
- 总结
简介
我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值。然而,有的时候我们需要反过来获取,知道Value值,求Key值。
本文将用实例介绍三种方法,通过传入Value值,获取得到Key值。
方法描述
循环法
循环法就是通过遍历Map里的Entry,一个个比较,把符合条件的找出来。
@Test
public void loop() {Map<String, Integer> map = new HashMap<>();map.put("A", 1);map.put("B", 2);map.put("C", 3);map.put("D", 2);//找到一个值getKeyByLoop(map, 1);//找到多个值getKeysByLoop(map, 2);//找不到getKeyByLoop(map, 4);
}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);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());
}
Apache Commons Collections的BidiMap
添加依赖:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.0</version>
</dependency>
Apache Commons Collections提供了双向Map的类BidiMap。它提供了getKey(value)方法返回Key值。
@Test
public void apacheCommons() {BidiMap<String, Integer> bidiMap = new DualHashBidiMap<>();bidiMap.put("A", 1);bidiMap.put("B", 3);bidiMap.put("B", 2);bidiMap.put("E", 9);bidiMap.put("C", null);bidiMap.put("D", 2);System.out.println(bidiMap.getKey(1)); // ASystem.out.println(bidiMap.getKey(2)); // DSystem.out.println(bidiMap.getKey(3)); // nullSystem.out.println(bidiMap.getKey(4)); // nullSystem.out.println(bidiMap.getKey(null)); // CSystem.out.println(bidiMap.getKey(9)); // ESystem.out.println(bidiMap); // {A=1, C=null, D=2, E=9}
}
从代码执行可知,如果出现key或者value相同的情况,后者会被替代。
总结
本文介绍了三种通过Value值获取Map中的Key值的方法,分别是循环法、Stream、Apache Commons Collections,这三种方法类似但不尽相同。
- 循环法和使用Stram本质上都是要遍历的,如果一个Map经常需要反向取Key值,则不建议使用,可以考虑Apache Commons提供的双向Map;
- 双向Map其实是一种空间换取时间的思想,虽然能较快的找到满足条件的Key值,但它也使用了更多的空间来储存双向Map;
- 双向Map并不支持多对一的关系。
如何选择,就看具体需求来取舍了。
JAVA 通过value获取Map中key的三种方法相关推荐
- Java获取map中key和value的方法
最近项目技术转型,开始使用java来写需求.需求中碰到需要获取map中key和value的地方,网络上查了下,得到了解决方法.为防止遗忘,故记录于此. java中获取map中key和value的方式有 ...
- JAVA 取出Map元素值 的三种方法
JAVA 取出Map元素值 的三种方法: (1)方法一: 通过Map的keySet()方法获取key 的set ,迭代set元素(每个元素调再用Map的get()方法); (2)方法二 : 通过Map ...
- php 正则获取数字,php结合正则获取字符串中数字的几种方法
本篇文章主要介绍php结合正则获取字符串中数字的几种方法,感兴趣的朋友参考下,希望对大家有所帮助. php结合正则获取字符串中数字<?php $patterns = "/\d+/&qu ...
- java定时执行某个方法_Java中定时执行任务的三种方法
Java中定时执行任务的三种方法 1)java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务: Timer timer=new Timer(); timer.sche ...
- JS获取URL中参数值的4种方法
方法一:正则法 function getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(& ...
- java 当前时间string_Java 获取当前系统时间的三种方法
准备工作: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; 方式一: /** ...
- web java获取当前时间_Java 获取当前系统时间的三种方法
准备工作: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; 方式一: /** ...
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
- PHP中删除目录的三种方法
原文链接:http://www.chinaz.com/program/2008/1022/41645.shtml PHP中删除目录的三种方法 1.递规法:利用递归一层一层的删. deleteDir($ ...
最新文章
- ubuntu中命令打开图片、文档、音乐、视频等
- TalkingData:2014年移动打车应用行业报告
- 跳转控制语句 break || continue || goto
- [转载] 百科全说——栾加芹:你适合这些食物吗?(11-03-07)
- 海归硕士程序员吐槽:我回国竟然找不到工作,这到底是什么操作?
- VC中树状控件(TreeCtrl)的用法
- c语言仓库即存储器,计算机基础4
- linux内核nasm,在x86汇编代码,NASM,Linux中操作字符串
- 坐着童年纸飞机的C语言for循环!超好玩!超详细!
- 计算机音乐雅俗共赏,“雅俗共赏”与音乐教育
- 金融信创爆发年,优炫数据库高可用高性能解决方案
- [pwnable.kr]passcode
- ARM嵌入式主板之路
- 2018年英语专升本英语阅读「Part II 阅读专区」【文章(图片)、答案、词汇记忆】
- kube-controller-manager源码分析(三)之 Informer机制
- java rollback_Spring中的@Transactional(rollbackFor = Exception.class)属性详解
- 如何理解shared library
- 三星s4 android8,三星可升级安卓8.0设备名单泄露 S6无缘
- Spark学习(二)Spark高可用集群搭建
- C++ 内存对齐详解加配图分析