您好,欢迎访问一九零五行业门户网

Java-类库-Guava-Bimap

bimap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。
通常情况下,我们在使用java的map时,往往是通过key来查找value的,但是如果出现下面一种场景的情况,我们就需要额外编写一些代码了。首先来看下面一种表示标识序号和文件名的map结构。
[code] @test public void logmaptest(){ map<integer,string> logfilemap = maps.newhashmap(); logfilemap.put(1,"a.log"); logfilemap.put(2,"b.log"); logfilemap.put(3,"c.log"); system.out.println("logfilemap:"+logfilemap); }
当我们需要通过序号查找文件名,很简单。但是如果我们需要通过文件名查找其序号时,我们就不得不遍历map了。当然我们还可以编写一段map倒转的方法来帮助实现倒置的映射关系。
[code] /** * 逆转map的key和value * @param <s> * @param <t> * @param map * @return */ public static <s,t> map<t,s> getinversemap(map<s,t> map) { map<t,s> inversemap = new hashmap<t,s>(); for(entry<s,t> entry: map.entryset()) { inversemap.put(entry.getvalue(), entry.getkey()); } return inversemap; }
[code] @test public void logmaptest(){ map<integer,string> logfilemap = maps.newhashmap(); logfilemap.put(1,"a.log"); logfilemap.put(2,"b.log"); logfilemap.put(3,"c.log"); system.out.println("logfilemap:"+logfilemap); map<string,integer> logfileinversemap = maps.newhashmap(); logfileinversemap=getinversemap(logfilemap); system.out.println("logfileinversemap:"+logfileinversemap); }
上面的代码可以帮助我们实现map倒转的要求,但是还有一些我们需要考虑的问题:
1. 如何处理重复的value的情况。不考虑的话,反转的时候就会出现覆盖的情况.
2. 如果在反转的map中增加一个新的key,倒转前的map是否需要更新一个值呢?
在这种情况下需要考虑的业务以外的内容就增加了,编写的代码也变得不那么易读了。这时我们就可以考虑使用guava中的bimap了。
bimap
bimap使用非常的简单,对于上面的这种使用场景,我们可以用很简单的代码就实现了:
[code] @test public void bimaptest(){ bimap<integer,string> logfilemap = hashbimap.create(); logfilemap.put(1,"a.log"); logfilemap.put(2,"b.log"); logfilemap.put(3,"c.log"); system.out.println("logfilemap:"+logfilemap); bimap<string,integer> filelogmap = logfilemap.inverse(); system.out.println("filelogmap:"+filelogmap); }
bimap数据的强制唯一性
在使用bimap时,会要求value的唯一性。如果value重复了则会抛出错误:java.lang.illegalargumentexception,例如: [code] @test public void bimaptest(){ bimap<integer,string> logfilemap = hashbimap.create(); logfilemap.put(1,"a.log"); logfilemap.put(2,"b.log"); logfilemap.put(3,"c.log"); logfilemap.put(4,"d.log"); logfilemap.put(5,"d.log"); }
logfilemap.put(5,”d.log”) 会抛出java.lang.illegalargumentexception: value already present: d.log的错误。如果我们确实需要插入重复的value值,那可以选择forceput方法。但是我们需要注意的是前面的key也会被覆盖了。
[code] @test public void bimaptest(){ bimap<integer,string> logfilemap = hashbimap.create(); logfilemap.put(1,"a.log"); logfilemap.put(2,"b.log"); logfilemap.put(3,"c.log"); logfilemap.put(4,"d.log"); logfilemap.forceput(5,"d.log"); system.out.println("logfilemap:"+logfilemap); } 输出: logfilemap:{5=d.log, 3=c.log, 2=b.log, 1=a.log}
理解inverse方法
inverse方法会返回一个反转的bimap,但是注意这个反转的map不是新的map对象,它实现了一种视图关联,这样你对于反转后的map的所有操作都会影响原先的map对象。例如:
[code] @test public void bimaptest(){ bimap<integer,string> logfilemap = hashbimap.create(); logfilemap.put(1,"a.log"); logfilemap.put(2,"b.log"); logfilemap.put(3,"c.log"); system.out.println("logfilemap:"+logfilemap); bimap<string,integer> filelogmap = logfilemap.inverse(); system.out.println("filelogmap:"+filelogmap); logfilemap.put(4,"d.log"); system.out.println("logfilemap:"+logfilemap); system.out.println("filelogmap:"+filelogmap); }
bimap的实现类
key-value map impl value-key map impl corresponding bimap
hashmap hashmap hashbimap
immutablemap immutablemap immutablebimap
enummap enummap enumbimap
enummap hashmap enumhashbimap
以上就是java-类库-guava-bimap的内容。
其它类似信息

推荐信息