當咱們在統計一個字符串中每一個單詞出現的次數時,一般的作法是分割字符串,遍歷字符串,而後放到一個map裏面,來進行統計,Guava中提供了相似功能的集合,Multisetthis
String strWorld="wer dffd ddsa dfd dreg de dr ce ghrt cf gt ser tg ghrt cf gt " + "ser tg gt kldf dfg vcd fg gt ls lser dfr wer dffd ddsa dfd dreg de dr " + "ce ghrt cf gt ser tg gt kldf dfg vcd fg gt ls lser dfr"; List<String> stringList = Splitter.on(" ") .trimResults() .splitToList(strWorld);//把字符串轉換爲集合 HashMultiset<String> multisets = HashMultiset.create();//建立一個Multiset集合 multisets.addAll(stringList); Iterator<String> iterator = multisets.iterator(); while (iterator.hasNext()){ String next = iterator.next(); System.out.println(next+" count: "+multisets.count(next)); }
內部使用Map進行實現,
HashMultiset.create()code
public final class HashMultiset<E> extends AbstractMapBasedMultiset<E> public static <E> HashMultiset<E> create() { return new HashMultiset(); } private HashMultiset() { super(new HashMap()); } ... ... }
abstract class AbstractMultiset<E> extends AbstractCollection<E> implements Multiset<E> { public boolean add(@Nullable E element) { this.add(element, 1); return true; } }
AbstractMapBasedMultisetelement
abstract class AbstractMapBasedMultiset<E> extends AbstractMultiset<E> implements Serializable { private transient Map<E, Count> backingMap; private transient long size; @GwtIncompatible private static final long serialVersionUID = -2250766705698539974L; protected AbstractMapBasedMultiset(Map<E, Count> backingMap) { this.backingMap = (Map)Preconditions.checkNotNull(backingMap); this.size = (long)super.size(); } public int add(@Nullable E element, int occurrences) { if(occurrences == 0) { return this.count(element); } else { Preconditions.checkArgument(occurrences > 0, "occurrences cannot be negative: %s", occurrences); Count frequency = (Count)this.backingMap.get(element); int oldCount; if(frequency == null) { oldCount = 0; this.backingMap.put(element, new Count(occurrences)); } else { oldCount = frequency.get(); long newCount = (long)oldCount + (long)occurrences; Preconditions.checkArgument(newCount <= 2147483647L, "too many occurrences: %s", newCount); frequency.add(occurrences); } this.size += (long)occurrences; return oldCount; } } ... ... }