Guava进修笔记:Guava新增凑集类型-Multiset

    添加时间:2013-7-8 点击量:

      Guava引进了JDK里没有的,然则很是有效的一些新的凑集类型。所有这些新凑集类型都能和JDK里的凑集腻滑集成。Guava凑集很是精准地实现了JDK定义的接口。Guava中定义的新凑集有:
      Multiset
      SortedMultiset
      Multimap
      ListMultimap
      SetMultimap
      BiMap
      ClassToInstanceMap
      Table


      Multiset凑集


      Multiset是什么?顾名思义,Multiset和Set的差别就是可以保存多个雷同的对象。在JDK中,List和Set有一个根蒂根基的差别,就是List可以包含多个雷同对象,且是有次序的,而Set不克不及有反复,且不包管次序(有些实现有次序,例如LinkedHashSet和SortedSet等)所以Multiset占领了List和Set之间的一个灰色地带:容许反复,然则不包管次序。
      常见应用处景:Multiset有一个有效的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计。 常见的通俗实现体式格式如下:



    @Test
    
    public void testWordCount(){
    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;
    String[] words
    =strWorld.split(\\|);
    Map
    <String, Integer> countMap = new HashMap<String, Integer>();
    for (String word : words) {
    Integer count
    = countMap.get(word);
    if (count == null) {
    countMap.put(word,
    1);
    }
    else {
    countMap.put(word, count
    + 1);
    }
    }
    System.out.println(
    countMap:);
    for(String key:countMap.keySet()){
    System.out.println(key
    + count:+countMap.get(key));
    }
    }


      上方的代码实现的功能很是简单,用于记录字符串在数组中呈现的次数。这种场景在实际的开辟过程还是轻易经常呈现的,若是应用实现Multiset接口的具体类就可以很轻易实现以上的功能需求:



        public void testMultsetWordCount(){
    
    String strWorld
    =wer|dfd|dd|dfd|dda|de|dr;
    String[] words
    =strWorld.split(\\|);
    List
    <String> wordList=new ArrayList<String>();
    for (String word : words) {
    wordList.add(word);
    }
    Multiset
    <String> wordsMultiset = HashMultiset.create();
    wordsMultiset.addAll(wordList);

    for(String key:wordsMultiset.elementSet()){
    System.out.println(key
    + count:+wordsMultiset.count(key));
    }
    }


      Multiset首要办法


      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) : 去除呈现给给定凑集参数的所有的元素


      常用办法实例:



    @Test
    
    public void testMultsetWordCount(){
    String strWorld
    =wer|dfd|dd|dfd|dda|de|dr;
    String[] words
    =strWorld.split(\\|);
    List
    <String> wordList=new ArrayList<String>();
    for (String word : words) {
    wordList.add(word);
    }
    Multiset
    <String> wordsMultiset = HashMultiset.create();
    wordsMultiset.addAll(wordList);


    //System.out.println(wordsMultiset:+wordsMultiset);

    for(String key:wordsMultiset.elementSet()){
    System.out.println(key
    + count:+wordsMultiset.count(key));
    }

    if(!wordsMultiset.contains(peida)){
    wordsMultiset.add(
    peida, 2);
    }
    System.out.println(
    ============================================);
    for(String key:wordsMultiset.elementSet()){
    System.out.println(key
    + count:+wordsMultiset.count(key));
    }


    if(wordsMultiset.contains(peida)){
    wordsMultiset.setCount(
    peida, 23);
    }

    System.out.println(
    ============================================);
    for(String key:wordsMultiset.elementSet()){
    System.out.println(key
    + count:+wordsMultiset.count(key));
    }

    if(wordsMultiset.contains(peida)){
    wordsMultiset.setCount(
    peida, 23,45);
    }

    System.out.println(
    ============================================);
    for(String key:wordsMultiset.elementSet()){
    System.out.println(key
    + count:+wordsMultiset.count(key));
    }

    if(wordsMultiset.contains(peida)){
    wordsMultiset.setCount(
    peida, 44,67);
    }

    System.out.println(
    ============================================);
    for(String key:wordsMultiset.elementSet()){
    System.out.println(key
    + count:+wordsMultiset.count(key));
    }
    }


      输出:



    de count:1
    
    dda count:
    1
    dd count:
    1
    dfd count:
    2
    wer count:
    1
    dr count:
    1
    ============================================
    de count:
    1
    dda count:
    1
    dd count:
    1
    dfd count:
    2
    peida count:
    2
    wer count:
    1
    dr count:
    1
    ============================================
    de count:
    1
    dda count:
    1
    dd count:
    1
    dfd count:
    2
    peida count:
    23
    wer count:
    1
    dr count:
    1
    ============================================
    de count:
    1
    dda count:
    1
    dd count:
    1
    dfd count:
    2
    peida count:
    45
    wer count:
    1
    dr count:
    1
    ============================================
    de count:
    1
    dda count:
    1
    dd count:
    1
    dfd count:
    2
    peida count:
    45
    wer count:
    1
    dr count:
    1


      申明:setCount(E element,int oldCount,int newCount): 办法,若是传入的oldCount和element的不一致的时辰,是不克不及讲element的count设置成newCount的。须要重视。


      Multiset不是Map


      须要重视的是Multiset不是一个Map<E,Integer>,尽管Multiset供给一项目组类似的功能实现。其它值得存眷的差别有:
      Multiset中的元素的反复个数只会是正数,且最大不会跨越Integer.MAX_VALUE。设定计数为0的元素将不会呈现multiset中,也不会呈现elementSet()和entrySet()的返回成果中。
      multiset.size() 办法返回的是所有的元素的总和,相当于是将所有反复的个数相加。若是须要知道每个元素的个数可以应用elementSet().size()获得.(因而调用add(E)办是multiset.size()增长1).
      multiset.iterator() 会轮回迭代每一个呈现的元素,迭代的次数与multiset.size()雷同。 iterates over each occurrence of each element, so the length of the iteration is equal to multiset.size().
      Multiset 支撑添加、移除多个元素以及从头设定元素的个数。履行setCount(element,0)相当于移除multiset中所有的雷同元素。
      调用multiset.count(elem)办法时,若是该元素不在该集中,那么返回的成果只会是0。


      Multiset的实现 


      Guava供给了Multiset的多种实现,这些实现根蒂根基对应了JDK中Map的实现:
      Map                        Corresponding Multiset   Supports null elements
      HashMap                  HashMultiset                      Yes
      TreeMap                   TreeMultiset                       Yes (if the comparator does)
      LinkedHashMap         LinkedHashMultiset             Yes
      ConcurrentHashMap  ConcurrentHashMultiset       No
      ImmutableMap          ImmutableMultiset               No


    我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
    分享到: