从Multiset中删除集合的出现次数

时间:2010-03-10 17:38:01

标签: java guava

似乎在Multiset中应该有一个removeAllOccuring(Collection)(或类似的)方法。类似于remove(Object,int)removeAll(Collection)。没有那种方法,实现其意图的最佳方法是什么。我写了一个小的JUnit驱动程序来演示:

/**
 * @see http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multiset.html
 * @see http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/HashMultiset.html  
 */
@Test
public void testBag() {
    Multiset<String> bag1 = HashMultiset.create();
    bag1.add("a", 2);
    bag1.add("b", 3);
    bag1.add("c", 3);

    logger.debug(bag1);
    Multiset<String> bag1Copy = HashMultiset.create(bag1);

    Multiset<String> bag2 = ImmutableMultiset.of("a","b","b","b","c","c");
    Multiset<String> expected = ImmutableMultiset.of("a","c");

    for( String el :  bag2.elementSet() ) {
        bag1.remove( el, bag2.count(el));
    } // end for

    Assert.assertEquals(expected, bag1);

    bag1Copy.removeAll(bag2);
    logger.debug( bag1Copy );
}

输出:

[b x 3, c x 3, a x 2]
[]

我认为可能有一种方法可以让我失踪,或者采用不同/更好的方式来循环移除要删除的集合。另请注意,我可以很容易地拥有一个用例,其中要删除的集合是List

1 个答案:

答案 0 :(得分:2)

没有什么可以做到的。 :(有一个关于这个和其他类似方法的内部(谷歌)功能请求(作为Multisets类的静态方法)。我会尝试将它粘贴到外部可见的功能请求,你可以留意

编辑:不过,除了Multiset之外,我还没有计划接受其他类型的集合作为此类方法的参数。将不得不考虑这一点。