Google Guava集合1: Multisets

本文介绍了Guava库中的Multiset,一种允许元素重复但不保证顺序的数据结构。通过对比List和Set,突出了Multiset在计数重复元素方面的优势,并提供了简单的示例代码。
[b]Google Guava: Multisets[/b]


我们继续研究Guava,这次我将介绍Multiset,虽然这个不经常使用,但是还是有必要介绍一下。

[b]Multiset是什么?[/b]
顾名思义,Multiset和Set的区别就是可以保存多个相同的对象

[b]它和List有什么区别?[/b]
在JDK中,List和Set有一个基本的区别,就是List可以包含多个相同对象,且是有顺序的,而Set不能有重复,且不保证顺序(有些实现有顺序,例如LinkedHashSet和SortedSet等)

所以Multiset占据了List和Set之间的一个灰色地带:允许重复,但是不保证顺序。

注意:这种集合在apache commons collections中也被称作“Bag”.

[b]怎么使用?[/b]
Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计。

以前这么做统计:
Map<MyClass,Integer> objectCounts = new HashMap<MyClass,Integer>();

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:
Multiset<MyClass> myMultiset = 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


简单多了吧,其实不仅可以一次添加删除一个,也可以一次多个:
Multiset<MyClass> myMultiset = 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说明:[url]http://docs.guava-libraries.googlecode.com/git-history/v9.0/javadoc/com/google/common/collect/Multiset.html[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值