Definir operações em Java
1. Introdução
Um conjunto é uma maneira útil de representar uma coleção exclusiva de itens.
Neste tutorial, aprenderemos mais sobre o que isso significa e como podemos usar um em Java.
2. Um pouco da teoria dos conjuntos
2.1. O que é um conjunto?
Um conjunto é simplesmente um grupo de coisas únicas. Portanto,a significant characteristic of any set is that it does not contain duplicates.
Podemos colocar o que quisermos em um conjunto. No entanto, normalmente usamos conjuntos para agrupar coisas que têm uma característica comum. Por exemplo, poderíamos ter um conjunto de veículos ou um conjunto de animais.
Vamos usar dois conjuntos de inteiros como um exemplo simples:
setA : {1, 2, 3, 4}
setB : {2, 4, 6, 8}
Diagramas como esses são conhecidos como diagramas de Venn e nos fornecem uma maneira útil de mostrar as interações entre os conjuntos, como veremos mais tarde.
2.2. A Intersecção de Conjuntos
O termointersection means the common values of different sets.
Podemos ver que os números inteiros 2 e 4 existem nos dois conjuntos. Portanto, a interseção de setA e setB é 2 e 4 porque esses são os valores comuns a ambos os conjuntos.
setA intersection setB = {2, 4}
2.3. A União dos Conjuntos
O termounion means combining the values of different sets.
Então, vamos criar um novo conjunto que é a união de nossos conjuntos de exemplo. Já sabemos que não podemos ter valores duplicados em um conjunto. No entanto, nossos conjuntos têm alguns valores duplicados (2 e 4). Portanto, quando combinamos o conteúdo de ambos os conjuntos, precisamos garantir a remoção de duplicatas. Então, terminamos com 1, 2, 3, 4, 6 e 8.
setA union setB = {1, 2, 3, 4, 6, 8}
2.4. O Complemento Relativo dos Conjuntos
O termorelative complement means the values from one set that are not in another. Também é referido como a diferença definida.
Agora vamos criar novos conjuntos que são os complementos relativos desetAesetB.
relative complement of setA in setB = {6, 8}
relative complement of setB in setA = {1, 3}
2.5. O Subconjunto e o Superconjunto
Um subconjunto é simplesmente parte de um conjunto maior, e o conjunto maior é chamado de superconjunto. Quando temos um subconjunto e um superconjunto, a união dos dois é igual ao superconjunto e a interseção é igual ao subconjunto.
3. Implementando operações de conjunto comjava.util.Set
Para ver como realizamos operações de conjunto em Java, vamos pegar os conjuntos de exemplo e implementar a interseção, união e complemento relativo. Então, vamos começar criando nossos conjuntos de amostra de inteiros:
private Set setA = setOf(1,2,3,4);
private Set setB = setOf(2,4,6,8);
private static Set setOf(Integer... values) {
return new HashSet(Arrays.asList(values));
}
3.1. Interseção
Primeiro, vamos usar o métodoretainAll paracreate the intersection of our sample sets. ComoretainAll modifica o conjunto diretamente, faremos uma cópia desetA chamadaintersectSet. Então usaremos o métodoretainAll para manter os valores que também estão emsetB:
Set intersectSet = new HashSet<>(setA);
intersectSet.retainAll(setB);
assertEquals(setOf(2,4), intersectSet);
3.2. União
Agora vamos usar o métodoaddAll paracreate the union of our sample sets. O métodoaddAll adiciona todos os membros do conjunto fornecido ao outro. Novamente, conformeaddAll atualiza o conjunto diretamente, faremos uma cópia desetA chamadaunionSet e adicionaremossetB a ele:
Set unionSet = new HashSet<>(setA);
unionSet.addAll(setB);
assertEquals(setOf(1,2,3,4,6,8), unionSet);
3.3. Complemento Relativo
Finalmente, usaremos o métodoremoveAll paracreate the relative complement of setB in setA. Sabemos que queremos os valores que estão emsetA que não existem emsetB. Então, só precisamos remover todos os elementos desetA que também estão emsetB:
Set differenceSet = new HashSet<>(setA);
differenceSet.removeAll(setB);
assertEquals(setOf(1,3), differenceSet);
4. Implementando operações de conjunto comStreams
4.1. Interseção
Vamos criar a interseção de nossos conjuntos usandoStreams.
Primeiro, obteremos os valores desetA em um fluxo. Then we’ll filter the stream to keep all values that are also in setB. E, por último, coletaremos os resultados em um novoSet:
Set intersectSet = setA.stream()
.filter(setB::contains)
.collect(Collectors.toSet());
assertEquals(setOf(2,4), intersectSet);
4.2. União
Agora vamos usar o método estáticoStreams.concat para adicionar os valores de nossos conjuntos em um únicostream.
In order to get the union from the concatenation of our sets, we need to remove any duplicates. Faremos isso simplesmente coletando os resultados em umSet:
Set unionSet = Stream.concat(setA.stream(), setB.stream())
.collect(Collectors.toSet());
assertEquals(setOf(1,2,3,4,6,8), unionSet);
4.3. Complemento Relativo
Finalmente, vamos criar o complemento relativo desetB emsetA.
Como fizemos com o exemplo de interseção, primeiro obteremos os valores desetA em um fluxo. Desta vez, filtraremos o stream para remover quaisquer valores que também estejam emsetB. Em seguida, coletaremos os resultados em um novoSet:
Set differenceSet = setA.stream()
.filter(val -> !setB.contains(val))
.collect(Collectors.toSet());
assertEquals(setOf(1,3), differenceSet);
5. Bibliotecas utilitárias para operações de conjuntos
Agora que vimos como realizar operações de conjunto básicas com Java puro,let’s use a couple of utility libraries to perform the same operations. Uma coisa boa sobre o uso dessas bibliotecas é que os nomes dos métodos nos dizem claramente qual operação está sendo executada.
5.1. Dependências
Para usarGuava SetseApache Commons Collections SetUtils, precisamos adicionar suas dependências:
com.google.guava
guava
27.1-jre
org.apache.commons
commons-collections4
4.3
5.2. Conjuntos de goiaba
Vamos usar a classe GuavaSets para realizarintersectioneunion em nossos conjuntos de exemplo. Para fazer isso, podemos simplesmente usar os métodos estáticosunioneintersection da classeSets:
Set intersectSet = Sets.intersection(setA, setB);
assertEquals(setOf(2,4), intersectSet);
Set unionSet = Sets.union(setA, setB);
assertEquals(setOf(1,2,3,4,6,8), unionSet);
Dê uma olhada em nossoGuava Sets article para saber mais.
5.3. Coleções Apache Commons
Agora vamos usar os métodos estáticosintersectioneunion da classeSetUtils das coleções do Apache Commons:
Set intersectSet = SetUtils.intersection(setA, setB);
assertEquals(setOf(2,4), intersectSet);
Set unionSet = SetUtils.union(setA, setB);
assertEquals(setOf(1,2,3,4,6,8), unionSet);
Dê uma olhada em nossoApache Commons Collections SetUtils tutorial para saber mais.
6. Conclusão
Vimos uma visão geral de como realizar algumas operações básicas em conjuntos, bem como detalhes de como implementar essas operações de várias maneiras diferentes.
Todos os exemplos de código podem ser encontradosover on GitHub.