ganhando_produtividade_com_Stream_API_Java
ganhando_produtividade_com_Stream_API_Java copied to clipboard
Desafio 18
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?
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);
Tudo bem!
Não tinha visto por esse ponto de vista.
Muito obrigado, novamente!
Esse é um pouquinho mais complicado porque utiliza o Map, mas com treino a gente pega! hehe
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);
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);