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时,原值会被覆盖
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。