Interseção entre duas matrizes inteiras

Interseção entre duas matrizes inteiras

1. Visão geral

Neste tutorial rápido, vamos dar uma olhada em comocompute the intersection between two Integer arrays ‘a'e‘b'.

Também vamos nos concentrar em como lidar com entradas duplicadas.

Para a implementação, usaremosStreams.

2. Predicado de associação para uma matriz

A interseção de dois conjuntos é, por definição, um conjunto com todos os valores de um, que também fazem parte do segundo conjunto.

Portanto, precisamos deFunction ou melhor,Predicate para decidir a participação no segundo array. ComoList fornece esse método pronto para uso, vamos transformá-lo em umList:

Predicate isContainedInB = Arrays.asList(b)::contains;

3. Construindo a Interseção

Para construir a matriz resultante, vamos considerar os elementos do primeiro conjunto sequencialmente e verificar se eles também estão contidos na segunda matriz.  Então, criaremos uma nova matriz com base nisso.

OStream API nos fornece os métodos necessários. First, we’ll create a Stream, then filter with the membership-Predicate and finally we’ll create a new array:

public static Integer[] intersectionSimple(Integer[] a, Integer[] b){
    return Stream.of(a)
      .filter(Arrays.asList(b)::contains)
      .toArray(Integer[]::new);
}

4. Entradas duplicadas

Como os arrays em Java não são implementaçãoSet, enfrentamos o problema de entradas duplicadas na entrada e, em seguida, no resultado. Observe que o número de ocorrências no resultado depende das ocorrências no primeiro parâmetro.

Mas para conjuntos, os elementos não devem ocorrer várias vezes. We can archive this by using the distinct() method:

public static Integer[] intersectionSet(Integer[] a, Integer[] b){
    return Stream.of(a)
      .filter(Arrays.asList(b)::contain)
      .distinct()
      .toArray(Integer[]::new);
}

Portanto, o comprimento da interseção não depende mais da ordem dos parâmetros.

No entanto, a interseção de uma matriz consigo mesma pode não ser a matriz novamente, pois removemos as entradas duplas.

5. Intersecção Multiset

Uma noção mais geral, que permite múltiplas entradas iguais, são multisets. Para eles, a interseção é então definida pelo número mínimo de ocorrências de entrada. Portanto, nossa associação -Predicate deve manter a pontuação com que frequência adicionamos um elemento ao resultado.

O métodoremove() pode ser usado para isso, o que retorna a associação e consome os elementos. Então, depois que todos os elementos iguais em‘b' forem consumidos, nenhum elemento mais igual será adicionado ao resultado:

public static Integer[] intersectionSet(Integer[] a, Integer[] b){
    return Stream.of(a)
      .filter(new LinkedList<>(Arrays.asList(b))::remove)
      .toArray(Integer[]::new);
}

Visto queArrays API retorna apenas umList, imutável, temos que gerar um mutável dedicado.

6. Conclusão

Neste artigo, vimos como usar os métodoscontainseremove para implementar uma interseção para dois arrays em Java.

Toda a implementação, fragmentos de código e testes podem ser encontrados em nossoGithub repository - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.