AFF Education Construa seu Futuro

Aula 47b - Loop for-each: Exemplos Práticos

Exemplo 4: Contando Elementos que Atendem uma Condição

Veja a tabela de índices do vetor de notas usado neste exemplo:

Linha Pos. 0 Pos. 1 Pos. 2 Pos. 3 Pos. 4 Pos. 5
Índice 012345
Elemento 8.55.07.54.09.06.5
For tradicional notas[0] notas[1] notas[2] notas[3] notas[4] notas[5]
For-each nota=8.5 nota=5.0 nota=7.5 nota=4.0 nota=9.0 nota=6.5
public class ContarAprovados {
    public static void main(String[] args) {
        double[] notas = {8.5, 5.0, 7.5, 4.0, 9.0, 6.5};
        int aprovados = 0;
        double notaMinima = 6.0;

        // Contando quantos foram aprovados
        for (double nota : notas) {
            if (nota >= notaMinima) {
                aprovados++;
            }
            System.out.println("Nota: " + nota);
        }

        System.out.println("Total de aprovados: " + aprovados);
        System.out.println("Total de reprovados: " + (notas.length - aprovados));
    }
}

Nota: 8.5

Nota: 5.0

Nota: 7.5

Nota: 4.0

Nota: 9.0

Nota: 6.5

Total de aprovados: 4

Total de reprovados: 2

Exemplo 5: For-each com Arrays de Diferentes Tipos

Array de boolean:

Linha Pos. 0 Pos. 1 Pos. 2 Pos. 3 Pos. 4
Índice 01234
Elemento truefalsetruetruefalse
For-each resposta=true resposta=false resposta=true resposta=true resposta=false
public class ArrayBoolean {
    public static void main(String[] args) {
        boolean[] respostas = {true, false, true, true, false};
        int corretas = 0;

        for (boolean resposta : respostas) {
            if (resposta) {
                corretas++;
            }
            System.out.println("Resposta: " + resposta);
        }

        System.out.println("Respostas corretas: " + corretas);
    }
}

Resposta: true

Resposta: false

Resposta: true

Resposta: true

Resposta: false

Respostas corretas: 3

Array de double — somando preços:

Linha Pos. 0 Pos. 1 Pos. 2 Pos. 3
Índice 0123
Elemento 19.9945.5012.3067.80
For-each preco=19.99 preco=45.50 preco=12.30 preco=67.80
public class ArrayDouble {
    public static void main(String[] args) {
        double[] precos = {19.99, 45.50, 12.30, 67.80};
        double total = 0;

        for (double preco : precos) {
            total += preco;
            System.out.printf("Preço: R$ %.2f\n", preco);
        }

        System.out.printf("Total: R$ %.2f\n", total);
    }
}

Preço: R$ 19.99

Preço: R$ 45.50

Preço: R$ 12.30

Preço: R$ 67.80

Total: R$ 145.59

Tabela Comparativa: for vs for-each

Característica Loop for tradicional Loop for-each
Sintaxe Mais complexa Mais simples
Legibilidade Menos legível Mais legível
Acesso ao índice Sim Não
Modificar array Sim Não
Percorrer parcialmente Sim (controlando i) Não
Percorrer de trás pra frente Sim Não
Apenas ler elementos Sim Sim (melhor opção)
Risco de erro de índice Maior (ArrayIndexOutOfBoundsException) Menor

Exemplo Prático: Sistema de Notas com Dois Vetores

Neste exemplo, dois vetores paralelos armazenam nomes e notas dos alunos. O índice i é usado para associar alunos[i] à sua respectiva notas[i]. Por isso, é necessário o for tradicional na parte que exibe a correlação entre eles.

Índice 01234
alunos[i] JoãoMariaPedroAnaCarlos
notas[i] 7.59.06.08.55.5
public class SistemaNotas {
    public static void main(String[] args) {
        String[] alunos = {"João", "Maria", "Pedro", "Ana", "Carlos"};
        double[] notas = {7.5, 9.0, 6.0, 8.5, 5.5};
        double notaMinima = 7.0;

        System.out.println("=== RELATÓRIO DE NOTAS ===");

        // For tradicional: precisamos de i para acessar alunos[i] e notas[i] juntos
        for (int i = 0; i < alunos.length; i++) {
            String status = (notas[i] >= notaMinima) ? "APROVADO" : "REPROVADO";
            System.out.println((i + 1) + ". " + alunos[i]
                + " - Nota: " + notas[i] + " - " + status);
        }

        // For-each: perfeito para calcular a média (não precisa do índice)
        double soma = 0;
        for (double nota : notas) {
            soma += nota;
        }
        double media = soma / notas.length;

        System.out.println("\nMédia da turma: " + media);
    }
}

=== RELATÓRIO DE NOTAS ===

1. João - Nota: 7.5 - APROVADO

2. Maria - Nota: 9.0 - APROVADO

3. Pedro - Nota: 6.0 - REPROVADO

4. Ana - Nota: 8.5 - APROVADO

5. Carlos - Nota: 5.5 - REPROVADO

Média da turma: 7.3

Perceba: Usamos for tradicional quando precisamos do índice (para associar alunos e notas pelo mesmo i), e for-each quando só precisamos calcular a soma (sem necessidade de índice).

Exemplo Extra: Carrinho de Compras

Um exemplo prático do mundo real: calcular o total de um carrinho e verificar quais itens estão acima de um determinado preço.

Índice 01234
produtos[i] ArrozFeijãoCaféAçúcarÓleo
precos[i] 8.9012.5022.005.709.80
public class CarrinhoCompras {
    public static void main(String[] args) {
        String[] produtos = {"Arroz", "Feijão", "Café", "Açúcar", "Óleo"};
        double[] precos = {8.90, 12.50, 22.00, 5.70, 9.80};
        double limite = 10.0;

        System.out.println("=== CARRINHO DE COMPRAS ===");

        // For tradicional: associa produto e preço pelo mesmo índice i
        for (int i = 0; i < produtos.length; i++) {
            String aviso = (precos[i] > limite) ? " ← acima de R$10,00" : "";
            System.out.printf("%-8s R$ %5.2f%s%n", produtos[i], precos[i], aviso);
        }

        // For-each: soma todos os preços sem precisar do índice
        double total = 0;
        for (double preco : precos) {
            total += preco;
        }

        System.out.printf("%nTotal: R$ %.2f%n", total);
    }
}

=== CARRINHO DE COMPRAS ===

Arroz R$ 8.90

Feijão R$ 12.50 ← acima de R$10,00

Café R$ 22.00 ← acima de R$10,00

Açúcar R$ 5.70

Óleo R$ 9.80

Total: R$ 58.90

Resumo da Aula

Loop for-each:

Loop for tradicional:

Regra geral: Use for-each quando precisar apenas ler os elementos. Use for tradicional quando precisar do índice, modificar o array, ou correlacionar dois vetores.

Exercícios — Parte B

Teste seus conhecimentos com exemplos mais práticos e elaborados:

1. Dado o vetor double[] precos = {19.99, 45.50, 12.30, 67.80}, qual é o valor de precos[2]?

2. O que o seguinte código imprime?

boolean[] respostas = {true, false, true, true, false};
int corretas = 0;
for (boolean r : respostas) {
    if (r) corretas++;
}
System.out.println(corretas);

3. Quando é obrigatório usar o for tradicional em vez do for-each?

4. Dado int[] notas = {8, 5, 7, 9, 6}, qual o valor de notas[0]?

5. Qual é a saída deste código?

double[] precos = {19.99, 45.50, 12.30, 67.80};
double total = 0;
for (double p : precos) {
    total += p;
}
System.out.printf("%.2f", total);

6. No exemplo do Sistema de Notas com alunos e notas em vetores separados, por que usamos for tradicional para exibir nome e nota juntos?

7. Qual o índice do último elemento do vetor String[] frutas = {"Maçã", "Banana", "Laranja", "Uva"}?

8. Qual o valor final de total após este loop?

double[] precos = {8.90, 12.50, 22.00, 5.70, 9.80};
double total = 0;
for (double p : precos) {
    if (p > 10.0) {
        total += p;
    }
}
System.out.printf("%.2f", total);

9. O for-each pode ser usado com qual tipo de dado?

10. Analise o código abaixo. Qual será a saída?

int[] nums = {3, 7, 2, 9, 5};
int maior = nums[0];
for (int n : nums) {
    if (n > maior) {
        maior = n;
    }
}
System.out.println("Maior: " + maior);

Exercícios de Aplicação AFF Education

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

1. Dado int[] v = {2, 4, 6}; int s = 0; for (int x : v) s += x;, qual o valor de s?

2. É possível alterar diretamente os elementos do array original usando apenas a variável do for-each (tipos primitivos)?