`
raymond.chen
  • 浏览: 1420082 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Multiset的使用

 
阅读更多

Multiset和Set的区别就是可以保存多个相同的对象。在JDK中,List和Set有一个基本的区别,就是List可以包含多个相同对象,且是有顺序的,而Set不能有重复,且不保证顺序(有些实现有顺序,例如LinkedHashSet和SortedSet等)所以Multiset占据了List和Set之间的一个灰色地带:允许重复,但是不保证顺序。 

 

Multiset提供多种实现,主要有:

    HashMultiset: 元素存放于HashMap

    LinkedHashMultiset: 元素存放于 LinkedHashMap,即元素的排列顺序由第一次放入的顺序决定

    TreeMultiset:元素被排序存放于TreeMap

    EnumMultiset: 元素必须是 enum 类型

    ImmutableMultiset: 不可修改的 Mutiset

 

常见使用场景:Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计。 

private static void multiset() {
	ImmutableMultiset<String> set1 = ImmutableMultiset.of("A", "B", "C", "D", "B");
	ImmutableMultiset<String> set2 = ImmutableMultiset.of("D", "B", "B", "B", "D", "D", "E", "F");
	System.out.println(set1); //[A, B x 2, C, D]
	System.out.println(set2); //[D x 3, B x 3, E, F]
	
	//集合数据过滤
	Multiset<String> resultSet = Multisets.filter(set1, new Predicate<String>() {
		@Override
		public boolean apply(String input) {
			return input.indexOf("D") >= 0;
		}
	});
	System.out.println(resultSet); //[D]
	
	//[A, B, C, D]
	System.out.println(set1.elementSet()); //返回去重后的元素集合
	
	set1.elementSet().stream().forEach(e -> {
		System.out.println(e + ": " + set1.count(e)); //显示元素及其计数值
	});
	
	//返回左set计数减去右set计数的结果大于0的元素
	System.out.println(Multisets.difference(set1, set2)); //[A, C]
	System.out.println(Multisets.difference(set2, set1)); //[D x 2, B, E, F]
	
	//交集:返回两个set都存在的、计数值最小的元素
	System.out.println(Multisets.intersection(set1, set2)); //[B x 2, D]
	System.out.println(Multisets.intersection(set2, set1)); //[D, B x 2]
	
	//并集:返回两个set所有的、计数值最大的元素
	System.out.println(Multisets.union(set1, set2)); //[A, B x 3, C, D x 3, E, F]
	System.out.println(Multisets.union(set2, set1)); //[D x 3, B x 3, E, F, A, C]
	
	//计数求和并做并集
	System.out.println(Multisets.sum(set1, set2)); //[A, B x 5, C, D x 4, E, F]
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics