[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!