Pergunta

Parece que deve haver um método removalAllOccuring (Collection) (semelhante ou) em Multiset. Um tipo de análogo ao remover (Object , int) e removeAll (Collection) . Curto desse método, qual é a melhor maneira de realizar seu intento. Eu escrevi um pequeno driver JUnit para demonstrar:

/**
 * @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 );
}

A saída:

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

Estou pensando que pode haver uma maneira desde que estou em falta, ou uma maneira diferente / melhor do que um loop sobre a coleção para ser removido. Também nota, que eu poderia facilmente ter um caso de uso onde a coleção a ser removido é um List

Foi útil?

Solução

Não há nada que vai fazer isso ainda. :( Há um (a Google) pedido de recurso interno sobre este e outros métodos semelhantes (como métodos estáticos para a classe multisets). Vou tentar obtê-lo colado em um pedido de recurso externamente visível que você pode manter um olho em .

EDIT: eu não tinha sido planejamento para aceitar outros tipos de coleções, além de uma Multiset como parâmetro para tais métodos, no entanto. Terá que pensar sobre isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top