Zagnieżdżone pętle pozwalają na wykonywanie jednej sekwencji pętli wewnątrz innej. Używa się ich, gdy trzeba przechodzić po strukturach wielowymiarowych, takich jak tablice dwuwymiarowe lub kombinacje elementów. Pierwsza pętla nazywa się zewnętrzną, a ta, która znajduje się wewnątrz — wewnętrzną.
Potrzeba pracy z zagnieżdżonymi strukturami, takimi jak macierze czy grafy, doprowadziła do powstania zagnieżdżonych pętli. Języki programowania, w tym Java, pierwotnie wspierają taki mechanizm, aby programować zadania przetwarzania tablic, grafów, siatek itp.
Zastosowanie zagnieżdżonych pętli może prowadzić do wysokiej złożoności czasowej, jeśli nie uwzględnia się liczby iteracji. Często pojawiają się problemy z czytelnością kodu i błędami w indeksowaniu. Niewłaściwe użycie prowadzi do wielokrotnego wykonywania tych samych działań.
Przykład kodu:
int[][] matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); }
Kluczowe cechy:
Czy można natychmiast zakończyć obie pętle za pomocą break?
Zwykły operator break kończy tylko wewnętrzną pętlę. Aby wyjść jednocześnie z kilku pętli, używa się etykiet (label):
outer: for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (warunek) break outer; } }
Czy jest możliwa pętla nieskończona z powodu zagnieżdżonych pętli?
Tak, jeśli warunek wyjścia z dowolnej z pętli jest błędnie zaimplementowany, powstanie pętla nieskończona. Szczególnie często zdarza się to przy błędach w inicjalizacji lub zwiększaniu licznika.
Czy można zmieniać zmienne zewnętrznej pętli z wewnętrznej?
Tak, technicznie jest to możliwe, ale znacznie pogarsza to czytelność i prowadzi do błędów. Lepiej tego unikać i wyraźnie oddzielać pracę każdej pętli.
Realizowane jest przetwarzanie tablicy dwuwymiarowej, ale zamiast i i j wszędzie używane jest i:
for (int i = 0; i < n; i++) { for (int i = 0; i < m; i++) {...} }
Zalety:
Wady:
Używane są różne nazwy zmiennych:
for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) {...} }
Zalety:
Wady: