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.groupingBy com uma função que retorna o comprimento da palavra.
  • O mapa deve ter chaves do tipo Integer e valores List<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

  1. Criamos uma lista de palavras.
  2. palavras.stream() cria um stream.
  3. collect(Collectors.groupingBy(String::length)) agrupa as palavras pelo comprimento. A função String::length é usada como classificador.
  4. O resultado é um Map<Integer, List<String>> onde cada chave é um comprimento e o valor é a lista de palavras com aquele comprimento.
  5. 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.toMap em vez de groupingBy, o que causaria erro de chave duplicada.
  • Esperar que a ordem das chaves seja a de inserção: groupingBy retorna um HashMap, que não garante ordem. Para ordem, use TreeMap com 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]}