给定两个多重集,例如,第一个:
Green
Green
Blue
Yellow
Yellow
Yellow
Cyan
Cyan
第二个:
Green
Yellow
Yellow
Magenta
Black
Black
我需要得到他们的交集,以便结果如下:
Green
Green
Green
Yellow
Yellow
Yellow
Yellow
Yellow
在Java中实现这一目标的有效方法是什么? (任何指向库或函数的链接都将受到赞赏。)
答案 0 :(得分:5)
看起来您需要多个集合的sum,过滤后只包含在其交集中至少出现一次的元素。这是您在Guava中寻找结果的一种方式:
ImmutableMultiset<String> first = ImmutableMultiset.of(
"Green", "Green",
"Blue",
"Yellow", "Yellow", "Yellow",
"Cyan", "Cyan");
ImmutableMultiset<String> second = ImmutableMultiset.of(
"Green",
"Yellow", "Yellow",
"Magenta",
"Black", "Black");
Multiset<String> result = Multisets.filter(
Multisets.sum(first, second),
Predicates.in(Multisets.intersection(first, second)));
System.out.println(result); // [Green x 3, Yellow x 5]
答案 1 :(得分:1)
您可能需要尝试Guava Multiset,它具有与普通Java Set
类似的API,包括您可能感兴趣的保留操作。
另请注意,要求推荐工具/图书馆的问题通常被认为是非正式的,因为答案非常主观。
答案 2 :(得分:1)
鉴于您的Multiset是Set的后代,您可以将其从一个保留到另一个,反之亦然,然后将这两个子集组合在一起:
multiset1.retainAll(multiset2);
multiset2.retainAll(multiset1);
multiset1.addAll(multiset2);
如果我正确地解析你的问题,你会在multiset1中得到你想要的东西,尽管你可能需要对它进行排序。 以这种方式做基数应该是正确的。