google guava集合之Multiset

kboypkb發表於2021-09-09

Multiset是什麼?

Multiset看似是一個Set,但是實質上它不是一個Set,它沒有繼承Set介面,它繼承的是Collection介面,你可以向Multiset中新增重複的元素,Multiset會對新增的元素做一個計數。

它本質上是一個Set加一個元素計數器。

Multiset使用示例:

package cn.outofmemory.guava.collection; import com.google.common.base.Splitter; import com.google.common.collect.HashMultiset; import com.google.common.collect.Multiset; public class MultisetDemo {     public static void main(String[] args) {         Multiset multiset = HashMultiset.create();         String sentences = "this is a story, there is a good girl in the story.";         Iterable words = Splitter.onPattern("[^a-z]{1,}").omitEmptyStrings().trimResults().split(sentences);         for (String word : words) {             multiset.add(word);         }         for (Object element : multiset.elementSet()) {             System.out.println((String)element + ":" + multiset.count(element));         }     } }

在上面的示例中我們對一段文字拆分成一個一個的單詞,然後依次放入到multiset中,注意這段文字中有多個重複的單詞,然後我們透過for迴圈遍歷multiset中的每一個元素,並輸出他們的計數。輸出內容如下:

story:2 is:2 girl:1 there:1 a:2 good:1 the:1 in:1 this:1

顯然計數不是問題,Multiset還提供了add和remove的過載方法,可以在add或這remove的同時指定計數的值。

常用實現 Multiset 介面的類有:

  • HashMultiset: 元素存放於 HashMap

  • LinkedHashMultiset: 元素存放於 LinkedHashMap,即元素的排列順序由第一次放入的順序決定

  • TreeMultiset:元素被排序存放於TreeMap

  • EnumMultiset: 元素必須是 enum 型別

  • ImmutableMultiset: 不可修改的 Mutiset

看到這裡你可能已經發現 Guava Collections 都是以 create 或是 of 這樣的靜態方法來構造物件。這是因為這些集合類大多有多個引數的私有構造方法,由於引數數目很多,客戶程式碼程式設計師使用起來就很不方便。而且以這種方式可以返回原型別的子型別物件。另外,對於建立範型物件來講,這種方式更加簡潔。

原文連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1916/viewspace-2805663/,如需轉載,請註明出處,否則將追究法律責任。

相關文章