请实现一种兼容Set的无序,List的可重复的数据结构

JAVA herman 173浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

Java 中,提供了很多常用的数据结构。比如,Map、List、Set 等。但是,在很多时候,我们可能需要统计某个数据出现的次数,这时往往我们的实现代码可能如下所示:

Map<String, Integer> counts = new HashMap<String, Integer>();
for (String key : words) {
    Integer count = counts.get(key);
    if (count == null) {
        counts.put(key, 1);
    } else {
        counts.put(key, count + 1);
    }
}

如果在多个项目,或者是一个项目中,有多个方法,多个功能需要这种统计功能。那么能不能把这种实现,抽取成一个新的数据结构,方便我们在任何地方使用?这就是本文所要说的,一种兼容Set的无序,List的可重复的数据结构:Multiset。

数据结构

这个问题,有可能你在面试中也会被问到。因为数据结构,看似最枯燥,但它具有最长久的生命力。

Guava 类库中提供了一种兼容 Set 的无序,List 的可重复的数据结构 Multiset。Multiset 底层还是数据结构,它就相当于对我们上面的代码进行了封装。同时也算是对 Java 中数据结构的一种扩展。

Multiset countMultiset = HashMultiset.create();
countMultiset.addAll("xttblog”);

int xttblogCount = countMultiset.count("xttblog");

当使用 Multiset 后,我们的代码就变得非常的简单了。我们只需存放,而最终的出现次数,重复次数,只需要通过 count 方法就可以获得,非常的方便。

同时 Multiset 还提供了 setCount(E, int) 方法,可以修改元素 E 在 Multiset 中的次数,但是不能把元素出现的次数修改为负数和大于 Integer.MAX_VALUE 的值,否则将会抛出异常。

Multiset 中的几个特点,可以总结如下:

  • Multiset 中的元素出现的次数只能为正数,前面说了原因。如果E的出现次数为 0,那么 E 将不出现在 multiset中,是不能在 elementSet() 和 entrySet() 的视图中。
  • multiset.size() 返回这个集合的大小,相当于在 multiset 中元素的出现的总数。如果想得到 multiset 中不同元素出现的总数,可以利用 elementSet().size() 来实现。
  • multiset.iterator() 可以遍历 Multiset 中的所有元素,所以 iteratior 遍历的次数就等于 multiset.size()。
  • Multiset 支持添加、删除元素,设置元素出现的次数;setCount(elem, 0) 相当于移除 elem 的所有元素。
  • multiset.count(elem) 方法中的 elem 如果没有出现在 Multiset 中,那么它的返回值永远都是 0。

Multiset 还有非常多的实现,比如:HashMultiset、LinkedHashMultiset、TreeMultiset、EnumMultiset、ImmutableMultiset。可以说 Guava 类库非常的强大,平时你能用到的很多工具功能,都能在它里面找到实现!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 请实现一种兼容Set的无序,List的可重复的数据结构