Google Guava常用集合类型解析
2017-08-31 本文已影响417人
AnakinSky
Multiset
Guava提供了一个新集合类型 Multiset,它可以多次添加相等的元素;
“集合概念的延伸,它的元素可以重复出现,与集合相同而与元组相反的是,Multiset元素的顺序是无关紧要的:Multiset {a, a, b}和{a, b, a}是相等的”
- count(E):给定元素在Multiset中的计数
- elementSet():Multiset中不重复元素的集合,类型为Set<E>
- entrySet():和Map的entrySet类似,返回Set<Multiset.Entry<E>>,其中包含的Entry支持getElement()和getCount()方法
- add(E, int):增加给定元素在Multiset中的计数
- remove(E, int):减少给定元素在Multiset中的计数
- setCount(E, int):设置给定元素在Multiset中的计数,不可以为负数
- size():返回集合元素的总个数(包括重复的元素)
Multiset multiset = HashMultiset.create();
for (int i = 0;i<20;++i) {
multiset.add(i);
}
for (int i = 0;i<20;i += 2) {
multiset.add(i);
}
for (Object element: multiset.elementSet()) {
System.out.printf("\n" + (Integer)element + ":" + multiset.count(element));
}
SortedMultiset
SortedMultiset是Multiset 接口的变种,它支持高效地获取指定范围的子集;
Multimap
Multimap类似Map<K, List<V>>或Map<K, Set<V>>,不再赘述;
BiMap
BiMap双向映射容器,BiMap<key,valuse>是特殊的map,可以用 inverse()反转BiMap<key, value>的键值映射,key反转成value,value反转成key,BiMap保证值是唯一的,因此 values()返回Set而不是普通的Collection,在BiMap中,如果你想把键映射到已经存在的值,会抛出IllegalArgumentException异常。如果对特定值,你想要强制替换它的键,请使用 BiMap.forcePut(key, value)。
BiMap<Integer,String> biMap = HashBiMap.create();
biMap.put(1,"num1");
biMap.put(2,"num1");
//java.lang.IllegalArgumentException: value already present: num1
BiMap<String,Integer> biMap1 = biMap.inverse();
Table
通常我们需要实现Map<key1,Map<key2,value>>,这种方式不仅写法上不雅观,在使用的时候也非常的不友好,因此guava提供了新容器Table实现类似c++ pair用法;
实现:HashBasedTable、TreeBasedTable、ImmutableTable、ArrayTable;
- rowMap():用Map<R, Map<C, V>>表现Table<R, C, V>。
- rowKeySet():返回”行”的集合Set<R>
- row(r):用Map<C, V>返回给定”行”的所有列,对这个map进行的写操作也将写入Table中
- cellSet():用元素类型为Table.Cell<R, C, V>的Set表现Table<R, C, V>。Cell类似于Map.Entry,但它是用行和列两个键区分的。
HashBasedTable<String, Integer,Integer> hashBasedTable = HashBasedTable.create();
hashBasedTable.put("Bob",18,69);
hashBasedTable.put("Arby",17,90);
Set<Table.Cell<String,Integer,Integer>> cells = hashBasedTable.cellSet();
for(Table.Cell<String, Integer, Integer> temp : cells){
System.out.println(temp.getRowKey()+":"+temp.getColumnKey()+":"+temp.getValue());
}
ClassToInstanceMap
ClassToInstanceMap是一种特殊的map,它的key是类型,value是对应key类型的对象;