AFF Education Construa seu Futuro

Aula 44 - for - break

Combinando for e break

Nesta aula, vamos explorar como utilizar a instrução break com loops for para controlar o fluxo de execução e interromper a iteração quando certas condições são atendidas.

Relembrando:

Uso Básico do break em for

A instrução break é usada para sair imediatamente de um loop, mesmo que a condição de parada não tenha sido atingida.

public class ForComBreak {
    public static void main(String[] args) {
        // Exemplo: Contagem de 1 a 10, mas interrompendo ao chegar em 5
        System.out.println("Contagem até encontrar o número 5:");
        
        for (int i = 1; i <= 10; i++) {
            System.out.print(i + " ");
            
            if (i == 5) {
                System.out.println("\nEncontrei o 5! Saindo do loop...");
                break;  // Sai do loop quando i é igual a 5
            }
        }
        
        System.out.println("Loop encerrado!");
    }
}

Contagem até encontrar o número 5:

1 2 3 4 5

Encontrei o 5! Saindo do loop...

Loop encerrado!

Dica: O break é útil quando você está procurando algo específico em um conjunto de dados e, ao encontrá-lo, não precisa continuar a iteração.

Exemplo: Busca em Array

Uma aplicação comum do break com for é a busca de elementos em um array:

public class BuscaEmArray {
    public static void main(String[] args) {
        // Array de números
        int[] numeros = {15, 32, 67, 89, 43, 28, 71, 56, 92, 10};
        
        // Número a ser buscado no array
        int busca = 43;
        int posicao = -1;  // -1 indica que o elemento não foi encontrado
        
        // Procurando o número no array
        System.out.println("Procurando o número " + busca + " no array:");
        
        for (int i = 0; i < numeros.length; i++) {
            System.out.print("Verificando posição " + i + ": " + numeros[i]);
            
            if (numeros[i] == busca) {
                System.out.println(" - Encontrado!");
                posicao = i;
                break;  // Sai do loop ao encontrar o número
            } else {
                System.out.println(" - Diferente!");
            }
        }
        
        // Verificando o resultado da busca
        if (posicao != -1) {
            System.out.println("\nO número " + busca + " foi encontrado na posição " + posicao);
        } else {
            System.out.println("\nO número " + busca + " não foi encontrado no array");
        }
        
        // Buscando um número que não existe no array
        busca = 100;
        posicao = -1;
        
        System.out.println("\nProcurando o número " + busca + " no array:");
        
        for (int i = 0; i < numeros.length; i++) {
            if (numeros[i] == busca) {
                posicao = i;
                break;
            }
        }
        
        if (posicao != -1) {
            System.out.println("O número " + busca + " foi encontrado na posição " + posicao);
        } else {
            System.out.println("O número " + busca + " não foi encontrado no array");
        }
    }
}

Procurando o número 43 no array:

Verificando posição 0: 15 - Diferente!

Verificando posição 1: 32 - Diferente!

Verificando posição 2: 67 - Diferente!

Verificando posição 3: 89 - Diferente!

Verificando posição 4: 43 - Encontrado!

O número 43 foi encontrado na posição 4

Procurando o número 100 no array:

O número 100 não foi encontrado no array

Eficiência: Usar o break para sair do loop assim que o elemento é encontrado é mais eficiente do que percorrer todo o array, especialmente em conjuntos de dados grandes.

Exemplo: Verificando Número Primo

Outra aplicação útil do break com for é na verificação de números primos:

public class VerificacaoPrimo {
    public static void main(String[] args) {
        // Verificando se um número é primo
        int numero = 17;
        boolean ehPrimo = true;  // Assumimos inicialmente que é primo
        
        // Casos especiais: números menores ou iguais a 1 não são primos
        if (numero <= 1) {
            ehPrimo = false;
        } else {
            // Verificando divisibilidade por números de 2 até a raiz quadrada do número
            int raiz = (int) Math.sqrt(numero);
            
            for (int i = 2; i <= raiz; i++) {
                System.out.println("Verificando se " + numero + " é divisível por " + i);
                
                if (numero % i == 0) {
                    // Se for divisível por algum número, não é primo
                    System.out.println(numero + " é divisível por " + i + " = " + (numero / i));
                    ehPrimo = false;
                    break;  // Não precisa continuar verificando
                }
            }
        }
        
        // Exibindo o resultado
        if (ehPrimo) {
            System.out.println("\n" + numero + " é um número primo!");
        } else {
            System.out.println("\n" + numero + " não é um número primo!");
        }
        
        // Verificando outro número
        numero = 15;
        ehPrimo = true;
        
        if (numero <= 1) {
            ehPrimo = false;
        } else {
            int raiz = (int) Math.sqrt(numero);
            
            for (int i = 2; i <= raiz; i++) {
                System.out.println("Verificando se " + numero + " é divisível por " + i);
                
                if (numero % i == 0) {
                    System.out.println(numero + " é divisível por " + i + " = " + (numero / i));
                    ehPrimo = false;
                    break;
                }
            }
        }
        
        if (ehPrimo) {
            System.out.println("\n" + numero + " é um número primo!");
        } else {
            System.out.println("\n" + numero + " não é um número primo!");
        }
    }
}

Verificando se 17 é divisível por 2

Verificando se 17 é divisível por 3

Verificando se 17 é divisível por 4

17 é um número primo!

Verificando se 15 é divisível por 2

Verificando se 15 é divisível por 3

15 é divisível por 3 = 5

15 não é um número primo!

Otimização: Usar break permite parar a verificação assim que encontramos um divisor, tornando o algoritmo mais eficiente. Não precisamos continuar verificando depois de descobrir que um número não é primo.

Break em Loops Aninhados

Por padrão, o break afeta apenas o loop mais interno. Para sair de loops aninhados, você pode usar rótulos (labels):

public class BreakLoopsAninhados {
    public static void main(String[] args) {
        // Exemplo de break em loops aninhados sem rótulo
        System.out.println("Break sem rótulo:");
        
        for (int i = 1; i <= 3; i++) {
            System.out.println("Loop externo: i = " + i);
            
            for (int j = 1; j <= 3; j++) {
                System.out.println("  Loop interno: j = " + j);
                
                if (j == 2) {
                    System.out.println("  Encontrado j = 2! Break aplicado.");
                    break;  // Sai apenas do loop interno
                }
            }
        }
        
        // Exemplo de break em loops aninhados com rótulo
        System.out.println("\nBreak com rótulo:");
        
        outerLoop:  // Rótulo para o loop externo
        for (int i = 1; i <= 3; i++) {
            System.out.println("Loop externo: i = " + i);
            
            for (int j = 1; j <= 3; j++) {
                System.out.println("  Loop interno: j = " + j);
                
                if (i == 2 && j == 2) {
                    System.out.println("  Encontrado i = 2 e j = 2! Break aplicado ao loop externo.");
                    break outerLoop;  // Sai do loop externo (rotulado)
                }
            }
        }
    }
}

Break sem rótulo:

Loop externo: i = 1

Loop interno: j = 1

Loop interno: j = 2

Encontrado j = 2! Break aplicado.

Loop externo: i = 2

Loop interno: j = 1

Loop interno: j = 2

Encontrado j = 2! Break aplicado.

Loop externo: i = 3

Loop interno: j = 1

Loop interno: j = 2

Encontrado j = 2! Break aplicado.

Break com rótulo:

Loop externo: i = 1

Loop interno: j = 1

Loop interno: j = 2

Loop interno: j = 3

Loop externo: i = 2

Loop interno: j = 1

Loop interno: j = 2

Encontrado i = 2 e j = 2! Break aplicado ao loop externo.

Cuidado: O uso excessivo de rótulos e breaks pode tornar o código difícil de entender e manter. Use-os com moderação e sempre documente claramente o seu propósito.

Exemplo: Encontrando Primeiro Elemento Comum

Um exemplo prático de uso de break com for é encontrar o primeiro elemento comum em dois arrays:

Diagrama de for-each aninhado iterando sobre dois arrays
Figura 6 — Visualização do for-each aninhado: o laço externo percorre array1 (variável num1) e, para cada elemento, o laço interno percorre array2 (variável num2) procurando uma correspondência. Ao encontrar, o return sai imediatamente da função.
public class ElementoComum {
    public static void main(String[] args) {
        // Dois arrays de números
        int[] array1 = {3, 7, 12, 9, 4, 15, 8};
        int[] array2 = {2, 10, 4, 6, 9, 11};
        
        int elementoComum = -1;  // -1 indica que nenhum elemento comum foi encontrado
        
        // Procurando o primeiro elemento comum
        outerLoop:  // Rótulo para o loop externo
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array2.length; j++) {
                if (array1[i] == array2[j]) {
                    elementoComum = array1[i];
                    System.out.println("Elemento comum encontrado: " + elementoComum);
                    System.out.println("Posição no array1: " + i);
                    System.out.println("Posição no array2: " + j);
                    break outerLoop;  // Sai de ambos os loops
                }
            }
        }
        
        // Verificando o resultado
        if (elementoComum == -1) {
            System.out.println("Nenhum elemento comum encontrado nos arrays.");
        }
        
        // Versão otimizada usando um método separado
        System.out.println("\nUsando método para encontrar elemento comum:");
        int resultado = encontrarElementoComum(array1, array2);
        
        if (resultado != -1) {
            System.out.println("Primeiro elemento comum: " + resultado);
        } else {
            System.out.println("Nenhum elemento comum encontrado.");
        }
    }
    
    // Método para encontrar o primeiro elemento comum entre dois arrays
    public static int encontrarElementoComum(int[] array1, int[] array2) {
        for (int num1 : array1) {
            for (int num2 : array2) {
                if (num1 == num2) {
                    return num1;  // Retorna imediatamente ao encontrar
                }
            }
        }
        
        return -1;  // Nenhum elemento comum encontrado
    }
}

Elemento comum encontrado: 4

Posição no array1: 4

Posição no array2: 2

Usando método para encontrar elemento comum:

Primeiro elemento comum: 4

Combinando for, break e continue

Você pode combinar break e continue em um loop for para controle de fluxo mais sofisticado:

public class ForBreakContinue {
    public static void main(String[] args) {
        // Array de números
        int[] numeros = {12, 5, 8, 3, 10, 15, 7, 20, 9};
        
        // Exemplo 1: Imprimindo números até encontrar o valor 15
        System.out.println("Números até encontrar o 15:");
        
        for (int numero : numeros) {
            if (numero == 15) {
                System.out.println("Encontrei o 15! Parando...");
                break;
            }
            
            System.out.print(numero + " ");
        }
        
        // Exemplo 2: Imprimindo apenas números pares, parando no primeiro valor maior que 15
        System.out.println("\n\nNúmeros pares até encontrar valor > 15:");
        
        for (int numero : numeros) {
            // Para no primeiro valor maior que 15
            if (numero > 15) {
                System.out.println("\nEncontrei valor > 15: " + numero + "! Parando...");
                break;
            }
            
            // Pula números ímpares
            if (numero % 2 != 0) {
                continue;  // Pula para a próxima iteração
            }
            
            System.out.print(numero + " ");
        }
        
        // Exemplo 3: Soma dos números até atingir um limite
        int soma = 0;
        int limite = 30;
        
        System.out.println("\n\nSomando números até atingir ou ultrapassar " + limite + ":");
        
        for (int numero : numeros) {
            soma += numero;
            System.out.println("Adicionando " + numero + ": Soma atual = " + soma);
            
            if (soma >= limite) {
                System.out.println("Limite atingido! Parando...");
                break;
            }
        }
    }
}

Números até encontrar o 15:

12 5 8 3 10 Encontrei o 15! Parando...

Números pares até encontrar valor > 15:

12 8 10

Encontrei valor > 15: 20! Parando...

Somando números até atingir ou ultrapassar 30:

Adicionando 12: Soma atual = 12

Adicionando 5: Soma atual = 17

Adicionando 8: Soma atual = 25

Adicionando 3: Soma atual = 28

Adicionando 10: Soma atual = 38

Limite atingido! Parando...

Boas Práticas e Considerações

Alternativa ao break: Em vez de usar break em um método, você pode simplesmente usar return para sair do método e retornar um valor quando a condição desejada for atendida.

Exercícios

Teste seus conhecimentos sobre o uso de for com break:

1. Qual é o efeito da instrução break em um loop for?

2. O que acontece quando um break é executado em um loop interno de loops aninhados (sem rótulo)?

3. Qual será a saída do seguinte código?

for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break;
    }
    System.out.print(i + " ");
}

4. Como podemos sair de um loop externo a partir de um loop interno?

5. Complete o código para buscar o valor 42 em um array e sair do loop ao encontrá-lo:

int[] numeros = {10, 25, 42, 16, 8, 30};
int posicao = -1;

for (int i = 0; i < numeros.length; i++) {
    if (numeros[i] == 42) {
        posicao = i;
        _________________;
    }
}

System.out.println("Posição do valor 42: " + posicao);

Exercícios de Aplicação AFF Education

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

1. O comando break dentro de um for:

2. Qual a saída de for (int i = 1; i <= 10; i++){ if (i == 3) break; System.out.print(i); }?