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的内容。