大家好,今天来为大家解答掌握Map键值获取技巧:Java中通过Value查找Key的四大方法详解这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
2 四种方法
2.1 循环法
循环法就是遍历Map中的Entry,一一比较,找到符合条件的。会出现三种情况:
(1)求一个值
(2) 查找多个值
(3) 找不到
具体代码如下:
@测试
公共无效循环(){
Mapmap=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));
}
privateK getKeyByLoop(Mapmap, V 值) {
for (Map.Entryentry : map.entrySet()) {
if (Objects.equals(entry.getValue(), value)) {
返回entry.getKey();
}
}
返回空值;
}
privateSetgetKeysByLoop(Mapmap, V值) {
Setset=Sets.newHashSet();
for (Map.Entryentry : map.entrySet()) {
if (Objects.equals(entry.getValue(), value)) {
set.add(entry.getKey());
}
}
返回集合;
}我特别想说的是,比较相等时,使用的是Objects.equals(a, b)方法,而不是a.equals(b)方法。这可以避免空指针异常。
2.2 Stream方法
Stream始终为各种集合操作提供优雅直观的方法,易于编写和理解。通过过滤器,可以取出满足相等条件的值。代码如下:
@测试
公共无效流(){
Mapmap=ImmutableMap.of("A", 1, "B", 2, "C", 3, "D", 2);
assertEquals(ImmutableSet.of("B", "D"), getKeysByStream(map, 2));
}
privateSetgetKeysByStream(Mapmap, V 值) {
返回map.entrySet()
。溪流()
.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()方法获取键值。
代码如下:
@测试
公共无效番石榴(){
BiMapbiMap=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值的唯一性。如果相同的值存储在那里,则会抛出异常:java.lang.IllegalArgumentException:值已存在。
2.4 Apache Commons Collections的BidiMap
同样,Apache Commons Collections也提供了一个双向Map类BidiMap,它也保持着一对一的关系,不能是多对一的。它提供了getKey(value) 方法来返回Key 值。代码如下:
@测试
公共无效apacheCommons(){
BidiMapbidiMap=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不支持多对一关系。
如何选择取决于具体需求。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【掌握Map键值获取技巧:Java中通过Value查找Key的四大方法详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这个标题好贴切啊,最近也在学习 Java,正好需要用到 Map 的方法!
有6位网友表示赞同!
看这标题就知道要学习如何提取 Map 中的关键信息。期待详细讲解!
有10位网友表示赞同!
Java 必修课,感觉自己是不是可以学到点真东西了!
有17位网友表示赞同!
通过 Value 获取 Key 这样的操作确实挺常用的,希望能从这篇博客里掌握几种更灵活的方法。
有13位网友表示赞同!
以前用 Value 只知道直接比较,现在想想好像还有其他方法。很想知道这篇文章有哪些新发现!
有9位网友表示赞同!
Java 的 Map 还是有不少小技巧,需要不断学习才能精通!
有18位网友表示赞同!
看来 Map 用得越久就越容易遇到这种问题,这篇文章刚好解决我的疑惑!
有9位网友表示赞同!
希望这篇文章能解释得详细点,特别是几种方法的区别和适用场景。
有11位网友表示赞同!
之前总是用笨拙的方法做这件事,现在可以期待学习更高效的方式了!
有6位网友表示赞同!
这个标题看起来很有吸引力,打算看一看具体的实现细节。
有17位网友表示赞同!
我刚开始接触 Java 编程,感觉这篇博客很有帮助!
有5位网友表示赞同!
通过 Value 获取 Key 的方法确实很重要,希望这篇文章能让我更好地理解。
有16位网友表示赞同!
Java 是一个非常基础的语言,掌握其常用的工具和技巧才能更高效地工作。
有11位网友表示赞同!
学习编程是一件很有乐趣的事情!希望这篇文章能够带给我新的启发!
有7位网友表示赞同!
我需要用到 Map 的方法,看来这篇文章正好适合我了!
有20位网友表示赞同!
通过 Value 获取 Key 的方法,感觉可以灵活地操控数据!
有9位网友表示赞同!
Java 开发的应用场景越来越广泛,学习 Java 必修课真的很重要!
有9位网友表示赞同!
这篇博客标题很有意思,期待作者能够用简洁通俗的语言讲解。
有17位网友表示赞同!
如果能用代码实例讲解更清晰的话那就完美了!
有19位网友表示赞同!