AFF Education Construa seu Futuro

Aula 58a - Lista de Dicionários (Continuação)

O que é uma Lista de Dicionários?

Uma Lista de Dicionários é uma combinação de duas estruturas de dados poderosas: ArrayList (lista) e HashMap (dicionário). É um ArrayList onde cada elemento é um HashMap.

Sintaxe:

ArrayList<HashMap<String, String>> lista = new ArrayList<>();

Lê-se: "ArrayList de HashMaps que têm String como chave e String como valor"

Sistema de Cadastro Interativo

Um sistema completo para cadastrar e gerenciar alunos:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class CadastroAlunos {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        ArrayList<HashMap<String, String>> alunos = new ArrayList<>();

        while (true) {
            System.out.println("=== SISTEMA DE CADASTRO ===");
            System.out.println("1. Cadastrar aluno");
            System.out.println("2. Listar alunos");
            System.out.println("3. Buscar aluno");
            System.out.println("4. Sair");
            System.out.print("Escolha: ");

            int opcao = entrada.nextInt();
            entrada.nextLine();

            if (opcao == 1) {
                // Cadastrar novo aluno
                HashMap<String, String> aluno = new HashMap<>();

                System.out.print("Nome: ");
                aluno.put("nome", entrada.nextLine());

                System.out.print("Matrícula: ");
                aluno.put("matricula", entrada.nextLine());

                System.out.print("Curso: ");
                aluno.put("curso", entrada.nextLine());

                System.out.print("Período: ");
                aluno.put("periodo", entrada.nextLine());

                alunos.add(aluno);
                System.out.println("Aluno cadastrado com sucesso!");

            } else if (opcao == 2) {
                // Listar todos os alunos
                if (alunos.isEmpty()) {
                    System.out.println("Nenhum aluno cadastrado!");
                } else {
                    System.out.println("=== LISTA DE ALUNOS ===");
                    for (int i = 0; i < alunos.size(); i++) {
                        HashMap<String, String> aluno = alunos.get(i);
                        System.out.println("Aluno " + (i + 1) + ":");
                        System.out.println("  Nome: "       + aluno.get("nome"));
                        System.out.println("  Matrícula: "  + aluno.get("matricula"));
                        System.out.println("  Curso: "      + aluno.get("curso"));
                        System.out.println("  Período: "    + aluno.get("periodo"));
                    }
                    System.out.println("Total: " + alunos.size() + " alunos");
                }

            } else if (opcao == 3) {
                // Buscar aluno por matrícula
                System.out.print("Digite a matrícula: ");
                String matriculaBusca = entrada.nextLine();

                boolean encontrado = false;
                for (HashMap<String, String> aluno : alunos) {
                    if (aluno.get("matricula").equals(matriculaBusca)) {
                        System.out.println("=== ALUNO ENCONTRADO ===");
                        System.out.println("Nome: "       + aluno.get("nome"));
                        System.out.println("Matrícula: "  + aluno.get("matricula"));
                        System.out.println("Curso: "      + aluno.get("curso"));
                        System.out.println("Período: "    + aluno.get("periodo"));
                        encontrado = true;
                        break;
                    }
                }

                if (!encontrado) {
                    System.out.println("Aluno não encontrado!");
                }

            } else if (opcao == 4) {
                System.out.println("Sistema encerrado!");
                break;
            }
        }

        entrada.close();
    }
}

=== SISTEMA DE CADASTRO ===

1. Cadastrar aluno

2. Listar alunos

3. Buscar aluno

4. Sair

Escolha: 1

Nome: Ana Silva

Matrícula: 2024001

Curso: Ciência da Computação

Período: 3º

Aluno cadastrado com sucesso!

Operações Comuns com Lista de Dicionários

Exemplos de operações úteis com funcionários:

Diagrama mostrando um loop for-each iterando sobre um ArrayList de HashMaps de funcionários
Figura 1 — Visualização do for-each percorrendo um ArrayList<HashMap>. A coleção funcionarios guarda três HashMaps (func1, func2, func3), e cada um contém as chaves nome, cargo e salario. A cada iteração do laço, a variável func "aponta" para um dos HashMaps da lista — primeiro func1, depois func2, depois func3 — permitindo acessar seus campos com func.get("nome"), func.get("cargo") e func.get("salario").
import java.util.ArrayList;
import java.util.HashMap;

public class OperacoesLista {
    public static void main(String[] args) {
        ArrayList<HashMap<String, String>> funcionarios = new ArrayList<>();

        // Adicionando funcionários
        HashMap<String, String> func1 = new HashMap<>();
        func1.put("nome",    "João");
        func1.put("cargo",   "Desenvolvedor");
        func1.put("salario", "5000");
        funcionarios.add(func1);

        HashMap<String, String> func2 = new HashMap<>();
        func2.put("nome",    "Maria");
        func2.put("cargo",   "Designer");
        func2.put("salario", "4500");
        funcionarios.add(func2);

        HashMap<String, String> func3 = new HashMap<>();
        func3.put("nome",    "Pedro");
        func3.put("cargo",   "Gerente");
        func3.put("salario", "7000");
        funcionarios.add(func3);

        // 1. Contar funcionários
        System.out.println("Total de funcionários: " + funcionarios.size());

        // 2. Calcular folha de pagamento total
        double folhaTotal = 0;
        for (HashMap<String, String> func : funcionarios) {
            folhaTotal += Double.parseDouble(func.get("salario"));
        }
        System.out.printf("Folha de pagamento: R$ %.2f\n", folhaTotal);

        // 3. Buscar por cargo
        String cargoBusca = "Desenvolvedor";
        System.out.println("Funcionários com cargo: " + cargoBusca);
        for (HashMap<String, String> func : funcionarios) {
            if (func.get("cargo").equals(cargoBusca)) {
                System.out.println("- " + func.get("nome"));
            }
        }

        // 4. Atualizar salário
        for (HashMap<String, String> func : funcionarios) {
            if (func.get("nome").equals("João")) {
                func.put("salario", "5500");
                System.out.println("Salário de João atualizado!");
            }
        }

        // 5. Remover funcionário
        funcionarios.removeIf(func -> func.get("nome").equals("Pedro"));
        System.out.println("Funcionário Pedro removido!");
        System.out.println("Novo total: " + funcionarios.size());
    }
}

Total de funcionários: 3

Folha de pagamento: R$ 16500.00

Funcionários com cargo: Desenvolvedor

- João

Salário de João atualizado!

Funcionário Pedro removido!

Novo total: 2

Exercícios Práticos

Leia cada trecho de código com atenção e responda o que acontece quando ele é executado:

1. O que este código imprime?

ArrayList<HashMap<String, String>> lista = new ArrayList<>();

HashMap<String, String> item = new HashMap<>();
item.put("fruta", "Manga");
item.put("cor",   "Amarelo");
lista.add(item);

System.out.println(lista.get(0).get("fruta"));

2. Qual é o valor impresso por System.out.println(times.size())?

ArrayList<HashMap<String, String>> times = new ArrayList<>();

HashMap<String, String> t1 = new HashMap<>();
t1.put("nome", "Flamengo"); t1.put("cidade", "Rio");
times.add(t1);

HashMap<String, String> t2 = new HashMap<>();
t2.put("nome", "Palmeiras"); t2.put("cidade", "São Paulo");
times.add(t2);

times.removeIf(t -> t.get("cidade").equals("Rio"));
System.out.println(times.size());

3. O código abaixo tem um erro. Qual linha está incorreta?

ArrayList<HashMap<String, String>> estoque = new ArrayList<>();

HashMap<String, String> prod = new HashMap<>();
prod.put("nome",       "Caneta");
prod.put("quantidade", "50");
estoque.add(prod);

System.out.println(estoque.get("nome"));   // linha A
System.out.println(estoque.size());        // linha B
System.out.println(prod.get("nome"));      // linha C

4. Quantas linhas este for imprime no terminal?

ArrayList<HashMap<String, String>> notas = new ArrayList<>();

String[] alunos = {"Ana", "Bruno", "Carlos", "Diana"};
String[] valores = {"8.5", "7.0", "9.0", "6.5"};

for (int i = 0; i < alunos.length; i++) {
    HashMap<String, String> entrada = new HashMap<>();
    entrada.put("aluno", alunos[i]);
    entrada.put("nota",  valores[i]);
    notas.add(entrada);
}

for (HashMap<String, String> n : notas) {
    if (Double.parseDouble(n.get("nota")) >= 7.0) {
        System.out.println(n.get("aluno") + " aprovado");
    }
}

5. Após executar o código abaixo, qual é o valor impresso?

ArrayList<HashMap<String, String>> carros = new ArrayList<>();

HashMap<String, String> c1 = new HashMap<>();
c1.put("modelo", "Civic");
c1.put("ano",    "2020");
carros.add(c1);

// Atualiza o ano do primeiro carro
carros.get(0).put("ano", "2024");

System.out.println(carros.get(0).get("ano"));

6. O que o código abaixo imprime na última linha?

HashMap<String, String> pessoa = new HashMap<>();
pessoa.put("nome",  "Lucas");
pessoa.put("idade", "22");

ArrayList<HashMap<String, String>> lista = new ArrayList<>();
lista.add(pessoa);

System.out.println(lista.get(0).get("email"));

7. Qual valor é impresso por System.out.printf("%.1f", total)?

ArrayList<HashMap<String, String>> vendas = new ArrayList<>();

String[] produtos = {"Teclado", "Monitor", "Headset"};
String[] precos   = {"250.0",   "900.0",   "150.0"};

for (int i = 0; i < produtos.length; i++) {
    HashMap<String, String> v = new HashMap<>();
    v.put("produto", produtos[i]);
    v.put("preco",   precos[i]);
    vendas.add(v);
}

double total = 0;
for (HashMap<String, String> v : vendas) {
    total += Double.parseDouble(v.get("preco"));
}
System.out.printf("%.1f", total);

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Para percorrer uma lista de dicionários e imprimir cada um, a melhor estrutura é:

2. Verificar se um dicionário contém a chave "email" é feito com: