[Java] Bora dar nome aos loops?
Labelled Loop, uma funcionalidade muito legal que existe em várias linguagens de programação e poucas pessoas sabem (eu acho). Hoje vamos falar sobre ela em Java :)
Quando se trabalha com matrizes de 2 dimensões ou mais, nosso código começa a ficar pesadinho e a complexidade aumenta, para solucionar esse problema temos o Labelled Loop, que é nada mais é do que dar um nome aos seus loops, podendo assim interagir com loops mais externos estando em um mais interno. Bora ver um exemplo:
Faz de conta que por algum motivo aleatório a gente tem uma matriz assim:
int[][] matriz = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
E por outro motivo aleatório queremos encontrar o valor 4 dentro dessa matriz, o caminho brute force mais simples que podemos fazer é:
for(int[] array: matriz) {
for(int number: array) {
if (number == 4) {
System.out.print(number);
break;
}
}
}
Beleza, esse código funciona e tá aí, achamos o 4 e imprimimos ele. Porém, esse código tem um problema muito sério, vamos passar o print para fora da condição e ver o que acontece.
for(int[] array: matriz) {
for(int number: array) {
System.out.print(number);
if (number == 4) break;
}
}
Boa, vamos ver o output dele: 1234789
Repare que ele achou o 4 na primeira posição do segundo array, então ele parou o loop interno, mas o externo continuou, fazendo com que o último array fosse impresso também.
Como resolver isso? Bem, vamos dar um nome para nosso loop mais externo para que quando o loop interno encontrar o valor, ele avisar o externo para parar também.
MATRIZ_LOOP: for(int[] array: matriz) {
for(int number: array) {
System.out.print(number);
if (number == 4) break MATRIZ_LOOP;
}
}
Agora nosso output ficou como? 1234
Excelente, assim que achamos o nosso número, ambos os loops pararam. Por convenção os nomes dos labels são escritos em maiúsculo (isso em Java). Com o label apontando para o primeiro “for”, basta chamar o “break” seguido do label e ambos os loops pararam.
Podemos usar essa mesma técnica com matrizes de N dimensões e além do “break”, também podemos usar o “continue” para ignorar a iteração atual e já começar a próxima.
Trabalhar com matrizes multidimensionais sempre é chatinho, nesse caso específico poderíamos fazer um algoritmo muito mais simples (talvez seja por isso que a gente não vê essa feature por aí) para resolver essa task e diminuir sua complexidade de O(N2). Agora que você já sabe como usar Labelled Loop, segura meu desafio de implementar esse mesmo algoritmo com uma complexidade beeeeem melhor.
Abraços!