guava-Multiset
传统的单词统计应用
Map<String, Integer> counts = new HashMap<String, Integer>();
for (String word : words) {
Integer count = counts.get(word);
if (count == null) {
counts.put(word, 1);
} else {
counts.put(word, count + 1);
}
}
很繁琐,易出错
[1]multiset特点1
multiset, in mathematics,as “a generalization of the notion of set in which members are allowed to appear more than once…In multisets,as in sets and in contrast to tuples, the order of elements is irrelevant:The multisets {a, a, b} and {a, b, a} are equal.”
[2]multiset特点2
- 可以看做是一个ArrayList,
- 可以看做是一个Map
[3]multiset API
- 当作为normal Collection使用时,和ArrayList相似
- add(E)添加元素
- iterator() 迭代器
- size()
- 当做Map
Methods
Method | Description |
---|---|
count(E) | element出现的次数 |
elementSet() | 去重集合Set |
entrySet() | 类似 Map.entrySet(),返回Set> 有getElement() 和 getCount()方法 |
add(E, int) | 添加给定个数的E |
remove(E, int) | 相反 |
setCount(E, int) | 设置为特定个数(数值大于0) |
size() | 返回全部elements数 |
API
Implementations
Map | Corresponding Multiset | Supportnull elements |
---|---|---|
HashMap | HashMultiset | yes |
TreeMap | TreeMultiset | yes |
LinkedHashMap | LinkedHashMultiset | yes |
ConcurrentHashMap | ConcurrentHashMultiset | no |
ImmutableMap | ImmutableMultiset | no |
应用示例
package com.learn.google.guava.ImmutableCollections;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
import java.util.*;
/**
*
*/
public class MultiSetTest {
public static void main(String[] args) {
//以前的方式
List<String> words = new ArrayList();
words.add("a");
words.add("a");
words.add("b");
words.add("c");
Map<String, Integer> counts = new HashMap<String, Integer>();
for (String word : words) {
Integer count = counts.get(word);
if (count == null) {
counts.put(word, 1);
} else {
counts.put(word, count + 1);
}
}
//支持重复元素
Multiset<String> multiset = HashMultiset.create();
multiset.add("a");
multiset.add("a");
multiset.add("b");
multiset.add("c");
for (Multiset.Entry<String> entry : multiset.entrySet()) {
System.out.println("key=" + entry.getElement() + "---" + "count=" +entry.getCount());
}
// key=a---count=2
// key=b---count=1
// key=c---count=1
Iterator<String> iterator = multiset.iterator();
System.out.print("\nmultiset[");
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println("]");
//元素统计
System.out.println("\na.count = " + multiset.count("a"));
//a.count = 2
System.out.println("\nsetCount(E, int)");
multiset.setCount("a", 3);
System.out.println("a.count = " + multiset.count("a"));
iterator = multiset.iterator();
System.out.print("multiset[");
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println("]");
//elementSet
Set<String> hashSet = multiset.elementSet();
System.out.print("\nelementSet[");
for (String iter : hashSet){
System.out.print(iter + " ");
}
System.out.println("]");
//输出:
// key=a---count=2
// key=b---count=1
// key=c---count=1
//
// multiset[a a b c ]
//
// a.count = 2
//
// setCount(E, int)
// a.count = 3
// multiset[a a a b c ]
//
// elementSet[a b c ]
}
}