Java中的Multiset交叉式操作

时间:2014-09-30 11:04:01

标签: java algorithm data-structures collections guava

给定两个多重集,例如,第一个:

Green
Green
Blue
Yellow
Yellow
Yellow
Cyan
Cyan

第二个:

Green
Yellow
Yellow
Magenta
Black
Black

我需要得到他们的交集,以便结果如下:

Green
Green
Green
Yellow
Yellow
Yellow
Yellow
Yellow

在Java中实现这一目标的有效方法是什么? (任何指向库或函数的链接都将受到赞赏。)

3 个答案:

答案 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中得到你想要的东西,尽管你可能需要对它进行排序。 以这种方式做基数应该是正确的。