Guava引入了許多新的收集類型,這些類型不在JDK中,但是卻十分有用。
Multiset
Multiset允許集合中插入重複的元素,Multiset只是一個實現類,其實現類有:
Multiset子類 | 是否支持空元素 |
---|---|
HashMultiset | Yes |
TreeMultiset | Yes |
LinkedHashMultiset | Yes |
ConcurrentHashMultiset | Yes |
ConcurrentHashMultiset | No |
ConcurrentHashMultiset | No |
示例:
@Test
public void testMultiSet () {
Multiset<String> multiset = HashMultiset.create();
multiset.addAll( Lists.newArrayList("I","love","China","China","is","my","love"));
multiset.count("love");//2
multiset.count("I");//1
Set<String> elementSet = multiset.elementSet();
System.out.println(elementSet);//[love, China, I, is, my]
Set<Multiset.Entry<String>> entries = multiset.entrySet();//統計元素頻次
System.out.println(entries);//[love x 2, China x 2, I, is, my]
}
SortedMultiset
SortedMultiset是能排序的multiSet,它只是一個接口,能夠按照範圍篩選子集,其實現類有TreeMultiset。
@Test
public void testTreeMultiset () {
// TreeMultiset.create(Ordering.natural()); 默認就是字典序
SortedMultiset<String> sortedMultiset = TreeMultiset.create();
sortedMultiset.addAll( Lists.newArrayList("I","love","China","China","is","my","love"));
sortedMultiset.count("love");//2
sortedMultiset.count("I");//1
Set<String> elementSet = sortedMultiset.elementSet();
System.out.println(elementSet);//[China, I, is, love, my]
Set<Multiset.Entry<String>> entries = sortedMultiset.entrySet();
// 可以看到和HashMutiSet的區別,元素排好序了
System.out.println(entries);//[China x 2, I, is, love x 2, my]
// 按範圍篩選子集合
SortedMultiset<String> subMultiset = sortedMultiset.subMultiset("I", BoundType.CLOSED, "lovv", BoundType.OPEN);
System.out.println(subMultiset);//[I, is, love x 2]
}
Multimap
Multimap 用於key值相同value值不同的場景,即同一個key值有多個value
Implementation | Keys behave like… | Values behave like… |
---|---|---|
ArrayListMultimap | HashMap | ArrayList |
HashMultimap | HashMap | HashSet |
LinkedListMultimap | LinkedHashMap | * LinkedList * |
LinkedHashMultimap | LinkedHashMap | LinkedHashSet |
TreeMultimap | TreeMap | TreeSet |
ImmutableListMultimap | ImmutableMap | ImmutableList |
ImmutableSetMultimap | ImmutableMap | ImmutableSet |
ArrayListMultimap示例:
@Test
public void testArrayListMultimap() {
// value 值允許重複 類似於list
Multimap<Object, Object> multimap = ArrayListMultimap.create();
multimap.put("a","aa");
multimap.put("a","aaa");
multimap.put("b","bb");
multimap.put("b","bbb");
multimap.put("b","bbb");
System.out.println(multimap);//{a=[aa, aaa], b=[bb, bbb]}
}
HashMultimap 示例:
@Test
public void testHashMultimap() {
// value 值不允許重複 類似於set
Multimap<Object, Object> multimap = HashMultimap.create();
multimap.put("a","aa");
multimap.put("a","aaa");
multimap.put("b","bb");
multimap.put("b","bbb");
multimap.put("b","bbb");
System.out.println(multimap);//{a=[aa, aaa], b=[bb, bbb]}
}
BiMap
雙向映射,value值是唯一的 不允許重複,如果添加的value值已經存在了會報錯。
@Test
public void testBiMap() {
// value 值不允許重複 類似於set
BiMap<Object, Object> biMap = HashBiMap.create();
biMap.put("1","a");
// biMap.put("2","a"); //拋出異常,java.lang.IllegalArgumentException: value already present: a
System.out.println(biMap.get("1"));//a
// biMap.inverse();
System.out.println(biMap.inverse().get("a"));//1
}
Table
@Test
public void testTable (){
Table<String, String, Double> weightedGraph = HashBasedTable.create();
weightedGraph.put(“v1”, “v2”, 4D);
weightedGraph.put(“v1”, “v3”, 20d);
weightedGraph.put(“v2”, “v3”, 5d);
weightedGraph.row("v2"); // returns a Map mapping v2 to 4, v3 to 20
weightedGraph.column("v3"); // returns a Map mapping v1 to 20, v2 to 5
}
RangeSet
@Test
public void testRangeSet (){
RangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closed(1, 10)); // {[1, 10]}
rangeSet.add(Range.closedOpen(11, 15)); // disconnected range: {[1, 10], [11, 15)}
rangeSet.add(Range.closedOpen(15, 20)); // connected range; {[1, 10], [11, 20)}
rangeSet.add(Range.openClosed(0, 0)); // empty range; {[1, 10], [11, 20)}
rangeSet.remove(Range.open(5, 10)); // splits [1, 10]; {[1, 5], [10, 10], [11, 20)}
rangeSet.rangeContaining(2);//Range [1,5]
rangeSet.rangeContaining(6);//null
}