guava中集合(2)

144 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

3、新集合类型接口

3.1、Multiset

3.1.1、本质

本质上是Map<E, Integer>结构,key为元素,value为计数。

3.1.2、常用实现

Multiset是 Map<E, Integer>结构 ,提供了多种实现,都是基于XXXMultiset的实现

  • HashMultiset
  • LinkedHashMultiset
  • TreeMultiset
  • ConcurrentHashMultiset
  • ImmutableMultiset

3.1.3、常见方法

image.png

3.1.4、代码示例

 /**
         * 1、统计字符串出现的次数
         *
         *   常规情况下可能要这样编写
         *    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);
         *          }
         *
         *
         *   Multiset就简单太多了
         *
         */
        List<String> strings = Lists.newArrayList("hello","java","hello","guava");
        Multiset<String> multiset = HashMultiset.create();
        // 直接加入集合
        multiset.addAll(strings);
        // 单次统计
        multiset.add("word");
        //multiset.add("word1",0);  -1
        // 指定统计次数
        multiset.add("word",2);
        // [java, hello x 2, guava, word x 3]
        System.out.println(multiset);
        multiset.remove("word",1);
        // 删除一个统计 [java, hello x 2, guava, word x 2]
        System.out.println(multiset);

        // 获取全部元素出现的次数 6
        System.out.println("获取全部元素出现的次数="+multiset.size());
        // 获取指定字符串的次数 2
        System.out.println("获取指定字符串的次数="+multiset.count("word"));
        // 返回元素的set集合 [java, hello, guava, word]
        System.out.println("返回元素的set集合="+multiset.elementSet());

        /**
         * 2个Multiset直之间的各种运算
         */
        Multiset<String> multiset1 = HashMultiset.create();
        multiset1.add("a", 2);
        multiset1.add("c", 2);

        Multiset<String> multiset2 = HashMultiset.create();
        multiset2.add("a", 2);
        multiset2.add("ad", 1);

        boolean flag =  multiset1.containsAll(multiset2);
        // 返true 因为包含了所有不重复元素,
        System.out.println("是否包含全部元素="+flag);

        // 保留出现在指定集合中的元素  之前 [a x 2, ad]  之后 [a x 2]
        multiset2.retainAll(multiset1);
        System.out.println("是否包含全部元素2="+multiset2);

        // 删除出现只指定集合中的元素
        multiset2.removeAll(multiset1);//multiset2移除所有"a",虽然multiset1只有2个"a"
        System.out.println("删除出现只指定集合中的元素="+multiset2);
        // 元素是否为空
        flag =  multiset2.isEmpty();
        System.out.println("元素是否为空="+flag);


        /**
         *  其他实现
         */
        Multiset<String> multisett = HashMultiset.create();
        multisett.add("hello");
        multisett.add("java");

        LinkedHashMultiset hashMultiset = LinkedHashMultiset.create();
        hashMultiset.add("hello");
        hashMultiset.add("ajava");
        System.out.println(multisett);
        System.out.println(hashMultiset);