Google Guava: Multisets
我们继续研究Guava,这次我将介绍Multiset,虽然这个不经常使用,但是还是有必要介绍一下。
Multiset是什么?
顾名思义,Multiset和Set的区别就是可以保存多个相同的对象
它和List有什么区别?
在JDK中,List和Set有一个基本的区别,就是List可以包含多个相同对象,且是有顺序的,而Set不能有重复,且不保证顺序(有些实现有顺序,例如LinkedHashSet和SortedSet等)
所以Multiset占据了List和Set之间的一个灰色地带:允许重复,但是不保证顺序。
注意:这种集合在apache commons collections中也被称作“Bag”.
怎么使用?
Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计。
以前这么做统计:
MapobjectCounts = new HashMap (); public void incrementCount(MyClass obj) { Integer count = objectCounts.get(obj); if (count == null) { objectCounts.put(obj,0); } else { objectCounts.put(obj,count++); } } public int getCount(MyClass obj) { Integer count = objectCounts.get(obj); if (count == null) { return 0; } else { return count; } }
有点麻烦?好吧,试试Multiset:
MultisetmyMultiset = HashMultiset.create(); MyClass myObject = new MyClass(); myMultiset.add(myObject); myMultiset.add(myObject); // add it a second time. System.out.println(myMultiset.count(myObject)); // 2 myMultiset.remove(myObject); System.out.println(myMultiset.count(myObject)); // 1
简单多了吧,其实不仅可以一次添加删除一个,也可以一次多个:
MultisetmyMultiset = HashMultiset.create(); MyClass myObject = new MyClass(); myMultiset.add(myObject,5); // Add 5 copies of myObject System.out.println(myMultiset.count(myObject)); // 5 myMultiset.remove(myObject,2); // remove 2 copies System.out.println(myMultiset.count(myObject)); // 3
是不是很有用啊,其实Multiset还有很多其他实现,建议你读一下它的API说明: http://docs.guava-libraries.googlecode.com/git-history/v9.0/javadoc/com/google/common/collect/Multiset.html