Multiset 是 guava 包下一種新的集合,可以方便的統計集合中重複元素出現的次數。
Multiset 有以下實現類:
- HashMultiset::元素存放於 HashMap
- LinkedHashMap:即元素的排列順序由第一次放入的順序決定
- TreeMultiset:元素被排序存放於TreeMap
- EnumMultiset::元素必須是 enum 類型
- ImmutableMultiset: 不可修改的 Mutiset
下面談談 HashMultiset 常用的使用方法:
場景:統計一份名單中每個名字出現的次數。
在以前我們可能會使用 HashMap 來處理:
List<String> nameList = Arrays.asList("張三", "李四", "王五", "喬二娃", "張三", "李四", "Tom");
Map<String, Integer> nameCountMap = new HashMap<>();
for (String name : nameList) {
Integer count = nameCountMap.get(name);
nameCountMap.put(name, count != null ? ++count : 1);
}
System.out.println(nameCountMap.get("張三"));//2
使用 Multiset :
List<String> nameList = Arrays.asList("張三", "李四", "王五", "喬二娃", "張三", "李四", "Tom");
//創建一個 Multiset
Multiset<String> nameMultiset = HashMultiset.create();
nameMultiset.addAll(nameList);
Integer count = nameMultiset.count("張三");//2
Multiset 接口中定義的方法主要有:
- add(E element) :向其中添加單個元素
- add(E element,int occurrences) : 向其中添加指定個數的元素
- count(Object element) : 返回給定參數元素的個數
- remove(E element) : 移除一個元素,其count值 會響應減少
- remove(E element,int occurrences): 移除相應個數的元素
- elementSet() : 將不同的元素放入一個Set中
- entrySet(): 類似與Map.entrySet 返回Set<Multiset.Entry>。包含的Entry支持使用getElement()和getCount()
- setCount(E element ,int count): 設定某一個元素的重複次數
- setCount(E element,int oldCount,int newCount): 將符合原有重複個數的元素修改爲新的重複次數
- retainAll(Collection c) : 保留出現在給定集合參數的所有的元素
- removeAll(Collectionc) : 去除出現給給定集合參數的所有的元素