<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                今天談談[Guava](http://www.iteblog.com/archives/tag/guava "查看 Guava 中的全部文章")類庫中的[Multiset](http://www.iteblog.com/archives/tag/multiset "查看 Multiset 中的全部文章")s數據結構,雖然它不怎么經常用,但是還是有必要對它進行探討。我們知道[Java](http://www.iteblog.com/archives/tag/java "查看 Java 中的全部文章")類庫中的Set不能存放相同的元素,且里面的元素是無順序的;而List是能存放相同的元素,而且是有順序的。而今天要談的[Multiset](http://www.iteblog.com/archives/tag/multiset "查看 Multiset 中的全部文章")s是能存放相同的元素,但是元素之間的順序是無序的。從這里也可以看出,Multisets肯定不是實現[Java](http://www.iteblog.com/archives/tag/java "查看 Java 中的全部文章")中Set接口的,因為Set接口是不能存放相同的元素![Java](http://www.iteblog.com/archives/tag/java "查看 Java 中的全部文章")中的Set 里面的元素有點像 :[A, C, B],而 Multiset 會是這樣 : [A ×?2, C ×?3, B ×?5],這個是有區別的。 在以前,如果我們需要統計一篇文章中各個單詞出現的次數,我們可能用下面的方法來實現: ~~~ public void wordCounts(List words) { 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); } } } ~~~ 如果我們需要得到某個單詞(比如good)的出現次數,我們可能這么寫: ~~~ int goodCount = counts.get("good"); ~~~ 很麻煩對嗎?而且Map中的get(E key)的含義都不那么明顯。那如果我們用Multisets來看看: ~~~ import com.google.common.collect.HashMultiset; import com.google.common.collect.Multiset; Multiset countMultiset = HashMultiset.create(); countMultiset.addAll(words); ~~~ 很簡單吧?甚至連循環都不需要。那么我們怎么得到某個單詞(比如good)的出現次數?很簡單: ~~~ int goodCount= countMultiset .count(“good”); ~~~ 在Multiset中提供了一個count(Object element)方法,得到某個對象在Multiset中出現的次數,這個顯然比在Map里面調get的可讀性好多了,不是嗎? > 需要注意:Multiset提供setCount(E, int)方法,可以修改元素E在Multiset中的次數,但是不能把元素出現的次數修改為負數和大于Integer.MAX_VALUE的值。否則將會拋出異常 ~~~ countMultiset .setCount("good", Integer.MAX_VALUE + 1); 或 countMultiset .setCount("good", -1); ~~~ 將會拋出 ~~~ Exception in thread "main" java.lang.IllegalArgumentException: count cannot be negative: -2147483648(-1) at com.google.common.base.Preconditions.checkArgument(Preconditions.java:119) at com.google.common.collect.Multisets.checkNonnegative(Multisets.java:1061) at com.google.common.collect.AbstractMapBasedMultiset.setCount(AbstractMapBasedMultiset.java:265) at com.google.common.collect.HashMultiset.setCount(HashMultiset.java:34) at com.wyp.test.testFiles(test.java:150) at com.wyp.test.main(test.java:156) ~~~ 因為在Multiset中setCount先會判斷所設置數據的狀態 ~~~ static void checkNonnegative(int count, String name) { checkArgument(count >= 0, "%s cannot be negative: %s", name, count); } ~~~ 可以看出,count是int類型的,最大的值為Integer.MAX_VALUE,在其基礎只上加上1將會變成負數,所以不行。 Multiset也不是Map<E, Integer>類型的結構, 我們可以用Map<E, Integer>來實現Multiset,但是利用Map<E, Integer>實現Multiset和[Google](http://www.iteblog.com/archives/tag/google "查看 Google 中的全部文章")?guava的實現還是有很大的區別的,主要表現如下: 1. Multiset中的元素出現的次數只能為正數,前面說了原因。如果E的出現次數為0,那么E將不出現在multiset中,是不能在elementSet()和entrySet()的視圖中; 1. multiset.size()返回這個集合的大小,相當于在multiset中元素的出現的總數。如果想得到multiset中不同元素出現的總數,可以利用elementSet().size()來實現; 1. multiset.iterator()可以遍歷multiset中的所有元素,所以iteration遍歷的次數就等于multiset.size(); 1. Multiset支持添加、刪除元素,設置元素出現的次數;setCount(elem, 0)相當于移除elem的所有元素; 1. multiset.count(elem)方法中的elem如果沒有出現在Multiset中,那么它的返回值永遠都是0。   常用的實現了Multiset 接口的類有: 1. HashMultiset: 元素存放于 HashMap 1. LinkedHashMultiset: 元素存放于 LinkedHashMap,即元素的排列順序由第一次放入的順序決定 1. TreeMultiset:元素被排序存放于TreeMap 1. EnumMultiset: 元素必須是 enum 類型 1. ImmutableMultiset: 不可修改的 Mutiset 轉載請注明: 轉載自[過往記憶(http://www.iteblog.com/)](http://www.iteblog.com/) 本文鏈接地址:?[Guava學習之Multisets(http://www.iteblog.com/archives/506)](http://www.iteblog.com/archives/506)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看