java代碼之美(5)---guava之Multiset


guava之Multiset

 

一、概述

       Guava提供了一個新集合類型Multiset,它可以多次添加相等的元素,且和元素順序無關。Multiset繼承於JDK的Cllection接口,而不是Set接口。它和set最大的區別就是

它可以對相同元素做一個計數的功能,普通的 Set 就像這樣 :[car, ship, bike],而 Multiset 會是這樣 : [car x 2, ship x 6, bike x 3]Multiset有一個有用的功能,

就是跟蹤每種對象的數量,所以你可以用來進行數字統計。每存放一個相同元素,那么該元素的count就加1。

譬如一個 List 里面有各種字符串,然后你要統計每個字符串在 List 里面出現的次數,這個用Multiset就能夠快速實現。

1、舉例說明

import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;

public class MultisetTest {

    public static void main(String[] args) {

        String str = "張三 李四 李四 王五 王五 王五";
        String[] strArr = str.split(" ");

        List<String> words = new ArrayList<String>(Arrays.asList(strArr));

        //創建一個HashMultiset集合,並將words集合數據放入
        Multiset<String> wordMultiset = HashMultiset.create();
        wordMultiset.addAll(words);

        //將不同的元素放在一個集合set中
        for (String key : wordMultiset.elementSet()) {
            //查看指定元素的個數
            System.out.println(key + "-->" + wordMultiset.count(key));
        }

        System.out.println("---------向集合中添加元素----------");
        //向集合中添加元素
        wordMultiset.add("李四");
        for (String key : wordMultiset.elementSet()) {
            System.out.println(key + "-->" + wordMultiset.count(key));
        }

        System.out.println("-------向集合中添加若干個元素------");
        //向集合中添加若干個元素
        wordMultiset.add("趙六", 10);
        for (String key : wordMultiset.elementSet()) {
            System.out.println(key + "-->" + wordMultiset.count(key));
        }

        System.out.println("--------向集合中移出一個元素------");
        //向集合中移出一個元素
        wordMultiset.remove("張三");
        for (String key : wordMultiset.elementSet()) {
            System.out.println(key + "-->" + wordMultiset.count(key));
        }

        System.out.println("------向集合中移出若干個元素------");
        //向集合中移出若干個元素,如果元素的個數小於要移除的個數,則會把該元素移除光
        wordMultiset.remove("趙六",5);
        for (String key : wordMultiset.elementSet()) {
            System.out.println(key + "-->" + wordMultiset.count(key));
        }


        System.out.println("-----設定某一個元素的重復次數-----");
        //設定某一個元素的重復次數
        wordMultiset.setCount("張三", 10);
        for (String key : wordMultiset.elementSet()) {
            System.out.println(key + "-->" + wordMultiset.count(key));
        }

        System.out.println("-----設置復合元素的個數設為新的重復次數-----");
        //設置復合元素的個數設為新的重復次數(條件是第二個參數的數量要是實際數量一致,否則無效)
        wordMultiset.setCount("and", 1,0);
        for (String key : wordMultiset.elementSet()) {
            System.out.println(key + "-->" + wordMultiset.count(key));
        }

        System.out.println("-------刪除給定集合中的元素------");
        //刪除給定集合中的元素
        wordMultiset.removeAll(words);
        for (String key : wordMultiset.elementSet()) {
            System.out.println(key + "-->" + wordMultiset.count(key));
        }
    }
} 

主要看運行結果:

根據運行結果我們得到:

  (1)它把把list放入HashMultiset中,就成了key還是list的屬性,value就是重復數的一個計數。

  (2)每添加一個相同元素,計數+1。

  (3)可以添加和移除計數的值。

 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) : 去除出現給給定集合參數的所有的元素

 3、常用的實現了Multiset 接口的類

      1、HashMultiset: 元素存放於 HashMap

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

     3、TreeMultiset:元素被排序存放於TreeMap

     4、EnumMultiset: 元素必須是 enum 類型

     5、ImmutableMultiset: 不可修改的 Mutiset

4、Multiset與Map<E, Integer>區別

實際開發中我們也可以利用Map<E, Integer>來實現計數功能,但它和Multiset還是有很大區別的,首先Multiset也不是Map<E, Integer>類型的結構,區別如下:

    1、Multiset中的元素出現的次數只能為正數,前面說了原因。如果E的出現次數為0,那么E將不出現在multiset中,是不能在elementSet()和entrySet()的視圖中;

    2、multiset.size()返回這個集合的大小,相當於在multiset中元素的出現的總數。如果想得到multiset中不同元素出現的總數,可以利用elementSet().size()來實現;

    3、multiset.iterator()可以遍歷multiset中的所有元素,所以iteration遍歷的次數就等於multiset.size();

    4、Multiset支持添加、刪除元素,設置元素出現的次數;setCount(elem, 0)相當於移除elem的所有元素;

    5、multiset.count(elem)方法中的elem如果沒有出現在Multiset中,那么它的返回值永遠都是0。

 

 想太多,做太少,中間的落差就是煩惱。想沒有煩惱,要么別想,要么多做。中校【14】 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM