Guava进修笔记:Guava新增凑集类型-Bimap
添加时间:2013-7-10 点击量:
BiMap供给了一种新的凑集类型,它供给了key和value的双向接洽关系的数据布局。
凡是景象下,我们在应用Java的Map时,往往是经由过程key来查找value的,然则若是呈现下面一种场景的景象,我们就须要额外编写一些代码了。起首来看下面一种默示标识序号和文件名的map布局。
@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倒转的办法来帮助实现倒置的映射关系。
/
逆转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;
}
@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应用很是的简单,对于上方的这种应用处景,我们可以用很简单的代码就实现了:
@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,例如:
@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也会被覆盖了。
@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对象。例如:
@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);
}
输出:
logfileMap:{3=c.log, 2=b.log, 1=a.log}
filelogMap:{c.log=3, b.log=2, a.log=1}
logfileMap:{4=d.log, 3=c.log, 2=b.log, 1=a.log}
filelogMap:{d.log=4, c.log=3, b.log=2, a.log=1}
BiMap的实现类
Key-Value Map Impl Value-Key Map Impl Corresponding BiMap
HashMap HashMap HashBiMap
ImmutableMap ImmutableMap ImmutableBiMap
EnumMap EnumMap EnumBiMap
EnumMap HashMap EnumHashBiMap
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
BiMap供给了一种新的凑集类型,它供给了key和value的双向接洽关系的数据布局。
凡是景象下,我们在应用Java的Map时,往往是经由过程key来查找value的,然则若是呈现下面一种场景的景象,我们就须要额外编写一些代码了。起首来看下面一种默示标识序号和文件名的map布局。
@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倒转的办法来帮助实现倒置的映射关系。
/
逆转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;
}
@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应用很是的简单,对于上方的这种应用处景,我们可以用很简单的代码就实现了:
@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,例如:
@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也会被覆盖了。
@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对象。例如:
@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);
}
输出:
logfileMap:{3=c.log, 2=b.log, 1=a.log}
filelogMap:{c.log=3, b.log=2, a.log=1}
logfileMap:{4=d.log, 3=c.log, 2=b.log, 1=a.log}
filelogMap:{d.log=4, c.log=3, b.log=2, a.log=1}
BiMap的实现类
Key-Value Map Impl Value-Key Map Impl Corresponding BiMap
HashMap HashMap HashBiMap
ImmutableMap ImmutableMap ImmutableBiMap
EnumMap EnumMap EnumBiMap
EnumMap HashMap EnumHashBiMap