Só reforçando o que o Matheus_Campelo te indicou: a ideia do for
aninhado é fazer com que um dos for
(o mais interno) seja completado (todas as iterações sejam feitas) a cada iteração (passagem) do for
mais externo. Assim, por exemplo se temos algo do tipo:
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
System.out.println("Item " + i);
}
}
Nesse caso, haverá 5^2 iterações, ou seja 25 passagens, sendo 5 iterações do for
interno (valore de j) para cada iteração do for
externo (para cada valor de i) . Em pormenores:
i = 0
j = 0, j = 1, j = 2, j = 3, j= 4
i = 1
j = 0, j = 1, j = 2, j = 3, j= 4
[…]
i = k
j = 0, j = 1, j = 2, j = 3, j= 4
i = 4
j = 0, j = 1, j = 2, j = 3, j= 4
É muito utilizada, por exemplo, para a leitura de vetores bidimensionais (matrizes), sendo (via de regra) o for
externo responsável pelas linhas e o for
interno pelas colunas, tanto para a leitura de dados (colocar dados na matriz) como também na impressão (extrair/exibir os dados da matriz)
Como se pode ver, na notação “Big-O”, indica-se O(n(ij))
de complexidade, ou seja, um for
aninhado, (caso não haja uma flag/sentinela/sinal de parada da repetição) tem complexidade i x j
. Por exemplo, se i = 3
ej = 5
, portanto n = 15
(15 repetições). Isso no melhor caso. O pior caso é O(n^2)
, ou seja quando i e j têm o mesmo tamanho, daí gerando uma complexidade quadrada como no exemplo que te apresentei linhas atrás.