java代码之美(5)---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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值