Goiaba - Conjuntos

Goiaba - Conjuntos

1. Visão geral

Neste tutorial, ilustraremos as maneiras mais úteis deleverage Guava to work with Java Sets.

Vamos começar bem simples ecreate a HashSet sem o novo operador, usando Guava:

Set aNewSet = Sets.newHashSet();

2. União de Conjuntos

Primeiro, vamos dar uma olhada em como podemosdo a union operation over Sets - usando a APISets.union() simples:

@Test
public void whenCalculatingUnionOfSets_thenCorrect() {
    Set first = ImmutableSet.of('a', 'b', 'c');
    Set second = ImmutableSet.of('b', 'c', 'd');

    Set union = Sets.union(first, second);
    assertThat(union, containsInAnyOrder('a', 'b', 'c', 'd'));
}

3. Produto cartesiano de conjuntos

Também podemos obterthe product of two sets usandoSets.cartesianProduct() como no exemplo a seguir:

@Test
public void whenCalculatingCartesianProductOfSets_thenCorrect() {
    Set first = ImmutableSet.of('a', 'b');
    Set second = ImmutableSet.of('c', 'd');
    Set> result =
      Sets.cartesianProduct(ImmutableList.of(first, second));

    Function, String> func =
      new Function, String>() {
        public String apply(List input) {
            return Joiner.on(" ").join(input);
        }
    };
    Iterable joined = Iterables.transform(result, func);
    assertThat(joined, containsInAnyOrder("a c", "a d", "b c", "b d"));
}

Observe que - para poder testar o resultado facilmente, estamos usandoFunctioneJoiner para converter a estruturaSet<List<Character>> complexa em umIterable<String> mais gerenciável.

4. Sets Intersecção

A seguir - vamos ver como obterthe intersection between two sets - usando a APISets.intersection():

@Test
public void whenCalculatingSetIntersection_thenCorrect() {
    Set first = ImmutableSet.of('a', 'b', 'c');
    Set second = ImmutableSet.of('b', 'c', 'd');

    Set intersection = Sets.intersection(first, second);
    assertThat(intersection, containsInAnyOrder('b', 'c'));
}

5. Diferença simétrica de conjuntos

Agora, vamos dar uma olhada na diferença simétrica de dois conjuntos - todos os elementos que estão contidos no conjunto 1 ou no conjunto 2, mas não em ambos:

@Test
public void whenCalculatingSetSymmetricDifference_thenCorrect() {
    Set first = ImmutableSet.of('a', 'b', 'c');
    Set second = ImmutableSet.of('b', 'c', 'd');

    Set intersection = Sets.symmetricDifference(first, second);
    assertThat(intersection, containsInAnyOrder('a', 'd'));
}

6. Conjunto de força

Agora - vamos ver como calcularthe power set – the set of all possible subsets desse conjunto.

No exemplo a seguir - usamosSets.powerSet() para calcular a potência de um determinado conjunto de caracteres:

@Test
public void whenCalculatingPowerSet_thenCorrect() {
    Set chars = ImmutableSet.of('a', 'b');

    Set> result = Sets.powerSet(chars);

    Set empty =  ImmutableSet. builder().build();
    Set a = ImmutableSet.of('a');
    Set b = ImmutableSet.of('b');
    Set aB = ImmutableSet.of('a', 'b');

    assertThat(result, contains(empty, a, b, aB));
}

7. ContiguousSet

A seguir - vamos dar uma olhada em um conjunto classificado de valores contíguos - oContiguousSet.

No exemplo a seguir - obtemos um conjunto de inteiros [10, 11, ..., 30] emContiguousSet:

@Test
public void whenCreatingRangeOfIntegersSet_thenCreated() {
    int start = 10;
    int end = 30;
    ContiguousSet set = ContiguousSet.create(
      Range.closed(start, end), DiscreteDomain.integers());

    assertEquals(21, set.size());
    assertEquals(10, set.first().intValue());
    assertEquals(30, set.last().intValue());
}

Esse tipo de estrutura de dados é, obviamente, algo que você pode fazer em Java simples com umTreeSet - masthe semantics of this specialized type of set are just much more nicer para trabalhar se precisar que seus dados sejam representados dessa forma.

8. RangeSet

Agora - vamos dar uma olhada emRangeSet. Podemos usarRangeSet para manter intervalos desconectados e não vazios.

No exemplo a seguir - quando começar com 2 intervalos desconectados e conectá-los a um único intervalo grande:

@Test
public void whenUsingRangeSet_thenCorrect() {
    RangeSet rangeSet = TreeRangeSet.create();
    rangeSet.add(Range.closed(1, 10));
    rangeSet.add(Range.closed(12, 15));

    assertEquals(2, rangeSet.asRanges().size());

    rangeSet.add(Range.closed(10, 12));
    assertTrue(rangeSet.encloses(Range.closed(1, 15)));
    assertEquals(1, rangeSet.asRanges().size());
}

Vejamos este exemplo em detalhes: **

  • Primeiro - inserimos os 2 intervalos desconectados:[1, 10]e[12, 15]

  • Em seguida - adicionamos um terceiro intervalo para conectar os 2 existentes:[10, 12]

  • Finalmente - verificamos queRangeSet foi inteligente o suficiente para ver que os 3 intervalos agora são um grande intervalo e os mesclamos em:[1, 15]

9. MultiSet

A seguir - vamos discutir como usarMultiset. Ao contrário dos conjuntos normais,a Multiset does support adding duplicate elements – which it counts as occurrences.

No exemplo a seguir - analisamos algumas lógicas simples de vários conjuntos:

@Test
public void whenInsertDuplicatesInMultiSet_thenInserted() {
    Multiset names = HashMultiset.create();
    names.add("John");
    names.add("Adam", 3);
    names.add("John");

    assertEquals(2, names.count("John"));
    names.remove("John");
    assertEquals(1, names.count("John"));

    assertEquals(3, names.count("Adam"));
    names.remove("Adam", 2);
    assertEquals(1, names.count("Adam"));
}

10. Obtenha os N principais elementos em aMultiSet

Agora - vamos ver um exemplo mais complexo e útil do uso deMultiSet. Obteremos os N principais elementos que ocorrem no conjunto - basicamente, os mais comuns.

No exemplo a seguir - classificamos os elementos emMultiset usandoMultisets.copyHighCountFirst():

@Test
public void whenGetTopOcurringElementsWithMultiSet_thenCorrect() {
    Multiset names = HashMultiset.create();
    names.add("John");
    names.add("Adam", 5);
    names.add("Jane");
    names.add("Tom", 2);

    Set sorted = Multisets.copyHighestCountFirst(names).elementSet();
    List sortedAsList = Lists.newArrayList(sorted);
    assertEquals("Adam", sortedAsList.get(0));
    assertEquals("Tom", sortedAsList.get(1));
}

11. Conclusão

Neste tutorial rápido, discutimos os casos de uso mais comuns e úteis deworking with Sets using the Guava library.

A implementação de todos esses exemplos e fragmentos de códigocan be found in my Guava github project - este é um projeto baseado no Eclipse, portanto, deve ser fácil de importar e executar como está.