ganhando_produtividade_com_Stream_API_Java icon indicating copy to clipboard operation
ganhando_produtividade_com_Stream_API_Java copied to clipboard

Desafio 18

Open dufernandess opened this issue 2 years ago • 5 comments

Oi, Cami, tudo bem?

No desafio 18 - "Verifique se todos os números da lista são iguais"

Eu gostaria de resolver esse desafio retornando uma lista apenas com os números que se repetem, porém, estou com dificuldades de chegar a essa resolução. Poderia me ajudar?

dufernandess avatar Sep 13 '23 18:09 dufernandess

Olá, tudo certinho, e por aí? (:

Então, temos algumas formas de fazer isso, segue um exemplo:

List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);

    // Agrupa os números com base no próprio número.
    Map<Integer, List<Integer>> grupos = numeros.stream()
        .collect(Collectors.groupingBy(num -> num));
    // Você pode ver que temos a indicação quais são os números que se repetem observando chave - valor.
    System.out.println(grupos); 
    
    // Filtra os grupos com tamanho do valor maior que 1, logo, os números repetidos.
    List<Integer> numerosRepetidos = grupos.entrySet().stream()
        .filter(entry -> entry.getValue().size() > 1) // Filtamos as chaves pelos valores contendo acima de 1 repetição
        .map(entry -> entry.getKey()) // Pegamos apenas as chaves
        .collect(Collectors.toList()); // Coletamos para uma nova lista

    // Imprime os números repetidos.
    System.out.println(numerosRepetidos);

cami-la avatar Sep 14 '23 19:09 cami-la

Tudo bem!

Não tinha visto por esse ponto de vista.

Muito obrigado, novamente!

dufernandess avatar Sep 14 '23 20:09 dufernandess

Esse é um pouquinho mais complicado porque utiliza o Map, mas com treino a gente pega! hehe

cami-la avatar Sep 14 '23 20:09 cami-la

Tem uma possibilidade que pesquisei, achei interessante. Segue abaixo:

Set<Integer> setNumeros = new HashSet<>();  // set para guardar primeira ocorrencia de cada numero
List<Integer> numerosRepetidos = numeros.stream()  // percorre toda a lista
                .filter(n -> !setNumeros.add(n))  // filtra pelos que não são adicionados à setNumeros (repetidos)
                .toList();   // adiciona à nova lista os números repetidos
System.out.println(numerosRepetidos);

dcasimiro89 avatar Oct 09 '23 19:10 dcasimiro89

Estava vendo e vi no chatgpt que é possivel colocar um filter com Stream dentro de outro, assim podendo comparar se os numeros se repentem iterando o elemento do Stream Externo como interno

List<Integer> numerosRepetidos = numeros.stream() .filter(n -> numeros.stream().filter(x -> x.equals(n)).count() > 1) // Contar quantas vezes o número aparece o Stream de dentro itera com n do Stream de fora .distinct() // Remover duplicatas dos repetidos // comparando os elementos de x é igual a n, se for maior que 1, ele permite o elemento dentro da stream .collect(Collectors.toList());

	        System.out.println("Números repetidos: " + numerosRepetidos);

Senuy avatar Sep 10 '24 15:09 Senuy