java 枚举获取key_【Java必修课】通过Value获取Map中的键值Key的四种方法

1 简介

我们都知道map是存放键值对的容器,知道了key值,使用方法map.get(key)能快速获取value值。然而,有的时候我们需要反过来获取,知道value值,求key值。

本文将用实例介绍四种方法,通过传入value值,获取得到key值。

2 四种方法

2.1 循环法

循环法就是通过遍历map里的entry,一个个比较,把符合条件的找出来。会有三种情况:

(1)找到一个值

(2)找到多个值

(3)找不到

具体代码如下:

@test

public 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总是在多种集合操作上都能提供优雅直观的方法,易写易理解。通过一个过滤器,即可把满足相等条件的值取出来,代码如下:

@test

public 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值了。

代码如下:

@test

public 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值。代码如下:

@test

public 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并不支持多对一的关系。

如何选择,就看具体需求来取舍了。

欢迎关注公众号,将持续为你更新...

多读书,多分享;多写作,多整理。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值