zoukankan      html  css  js  c++  java
  • java代码(5) ---guava之Multiset


    guava之Multiset


     一、概述

      Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关,Multiset继承于JDK的Collection接口,而不是Set接口,它和set最大的区别就是

    它可以对相同元素做一个计数的功能,普通的Set就像:[car,ship,bike],而Multiset会是这样:[car x 2,ship x 6,bike x 3]有这样有用的功能

    就是跟踪每种对象的数量,所以你可以用来进行数字统计,每存放一个元素,那么该元素的count就加1

    譬如一个List里面有各种字符串,然后你要统计每个字符串List里面出现的次数,这个用Multiset就可以快速实现

    1、举例说明 

    public class MultisetTest {
        public static void main(String[] args) {
    
            String str = "张三 李四 李四 王五 王五 王五";
            String[] strArr = str.split(" ");
            List<String> words = 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("张三", 10,1);
            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:不可修改的Multiset

    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中的所有元素,所以iterator遍历的次数就相当于multiset.size();

      4、Multiset支持添加,删除元素,设置元素出现的次数,setCount(elem,0)相当于移除elem的所有元素;

      5、multiset.count(elem)方法中的elem如果没有出现在Multiset中,那么它的返回值永远是0

  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/zhenbian/p/12935720.html
Copyright © 2011-2022 走看看