Médio Java
Agrupamento de palavras por comprimento
Enunciado
Dada uma lista de palavras, agrupe-as pelo seu comprimento usando Collectors.groupingBy. Imprima o mapa resultante.
Requisitos
- Use
Collectors.groupingBycom uma função que retorna o comprimento da palavra. - O mapa deve ter chaves do tipo
Integere valoresList<String>. - Imprima o mapa.
Código inicial
import java.util.*;
import java.util.stream.*;
public class ExercicioMedio {
public static void main(String[] args) {
List<String> palavras = Arrays.asList("java", "stream", "api", "collect", "group", "map", "filter");
// Complete aqui
}
}
Saída esperada
{3=[api, map], 4=[java, group], 5=[stream], 6=[filter], 7=[collect]}
Ver dica
Use Collectors.groupingBy(String::length).
Mostrar solução
import java.util.*;
import java.util.stream.*;
public class ExercicioMedio {
public static void main(String[] args) {
List<String> palavras = Arrays.asList("java", "stream", "api", "collect", "group", "map", "filter");
Map<Integer, List<String>> porComprimento = palavras.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(porComprimento);
}
}
Passo a passo
- Criamos uma lista de palavras.
palavras.stream()cria um stream.collect(Collectors.groupingBy(String::length))agrupa as palavras pelo comprimento. A funçãoString::lengthé usada como classificador.- O resultado é um
Map<Integer, List<String>>onde cada chave é um comprimento e o valor é a lista de palavras com aquele comprimento. - Imprimimos o mapa.
Por que funciona
Collectors.groupingBy é um coletor que particiona os elementos do stream em grupos de acordo com o resultado da função de classificação. Internamente, ele usa um Map para acumular os elementos. Como o stream é processado de forma preguiçosa, o agrupamento só ocorre quando collect é chamado.
Erros comuns
- Esquecer de importar
java.util.stream.Collectors. - Usar
Collectors.toMapem vez degroupingBy, o que causaria erro de chave duplicada. - Esperar que a ordem das chaves seja a de inserção:
groupingByretorna umHashMap, que não garante ordem. Para ordem, useTreeMapcom o coletor de três argumentos.
Outra forma de resolver
Para ordenar as chaves, use:
Map<Integer, List<String>> porComprimento = palavras.stream()
.collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));
Isso é útil quando a ordem das chaves importa.
Saída esperada
{3=[api, map], 4=[java, group], 5=[stream], 6=[filter], 7=[collect]}