Mówią, że najlepszy programista to leniwy programista. Zamiast wykonywać kilka razy tego samego typu czynności, wymyśli algorytm, który wykona tę pracę za niego. I zrobi to dobrze, żeby nie było potrzeby powtarzania. Aby uniknąć ciągłego pisania tego samego kodu, wymyślono pętle. Wyobraźmy sobie, że musimy wyświetlić na konsoli liczby od 0 do 99. Kod bez pętli:
System.out.println(0);
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
// I tak dalej
Ten kod zajmie 100 linii! Tak wiele. A oto jak by to wyglądało z pętlą:
for(int i = 0; i < 100; i++) {
System.out.println(i);
}
Tylko 3 linie!
Co to są pętle for?
Pętla for to struktura kontrolna kodu programu, która przerywa liniowość wykonywania algorytmu i pozwala na wielokrotne wykonanie określonego kodu. Na przykład musisz wziąć 30 kropli leku. Algorytm będzie mniej więcej taki:- Przygotuj szklankę.
- Otwórz pokrywę.
- Zdobądź 1 kroplę.
- Zdobądź 2 krople. ...
- Zdobądź 30 kropli.
- Zamknij lek.
- Weź otrzymaną porcję.
- Przygotuj szklankę.
- Otwórz korek kroplowy.
- Zdobądź 30 kropli.
- Zamknij lek.
- Weź otrzymaną porcję.
Jak działa pętla for
Pętli for używa się w następujący sposób:for(<начальная точка>; <stan выхода>; <операторы счетчика>) {
// Treść pętli
}
Пример перебора цифр от 0 до 5 и вывод каждой в консоль:
for(int i = 0; i < 5; i++) {
System.out.println(i);
}
Wniosek:
0
1
2
3
4
Jeśli przetłumaczymy ten wpis na język ludzki, otrzymamy następujący komunikat: „ Utwórz zmienną i o wartości początkowej 0, aż osiągnie 5, dodaj do niej 1 i przy każdym kroku zapisz wartość i do konsoli ”. Pętla for w Javie składa się z trzech etapów, które można przedstawić na poniższym diagramie: Warunkiem wyjścia z pętli jest wyrażenie logiczne. Jeśli jest fałszywe, pętla się zakończy. W powyższym przykładzie zmienna i
jest zwiększana o 1. Jeśli jej wartość jest mniejsza niż 5, pętla jest kontynuowana. Ale gdy tylko i
osiągnie wartość większą lub równą 5, cykl się zatrzyma. Operator licznika to wyrażenie, które dokonuje konwersji zmiennej licznika. W powyższym przykładzie zmienna i
została zwiększona o 1. Oznacza to, że pętla zostanie wykonana dokładnie 5 razy. Jeśli operator licznika doda do zmiennej 2 i
, wynik będzie inny:
for(int i = 0; i < 5; i = i + 2) {
System.out.println(i);
}
Wniosek:
0
2
4
Możesz także pomnożyć zmienną, podzielić, podnieść do potęgi i ogólnie robić, co chcesz. Najważniejsze jest to, że wynikiem transformacji jest liczba. Ciałem pętli jest dowolny kod, który można wykonać. W powyższym przykładzie ciało pętli wysyłało wartość zmiennej i do konsoli, ale zawartość tego ciała jest ograniczona zadaniem i wyobraźnią. Podsumowując cały schemat, zasada działania tej pętli for jest następująca: kod znajdujący się w treści pętli zostanie wykonany tyle razy, ile konwersji wykona operator licznika, zanim spełniony zostanie warunek wyjścia z pętli . Jeśli ustawisz warunek wyjścia z pętli jako true
:
for(int i = 0; true; i++) {
if(i % 1000000 == 0) System.out.println(i);
}
System.out.println("Loop ended");
Następnie kod po pętli zostanie oznaczony błędem unreachable statement
, ponieważ nigdy nie zostanie wykonany. Wyzwanie dla pomysłowości: czy w wyniku uruchomienia poniższego kodu „ Loop ended
” zostanie wypisane na konsolę, czy pętla będzie działać w nieskończoność?
for(int i = 0; i > -1; i++) {
if(i % 1000000 == 0) System.out.println(i);
}
System.out.println("Loop ended");
Odpowiedź: będzie. Zmienna i prędzej czy później osiągnie swoją wartość maksymalną, a dalsze zwiększanie spowoduje zmianę jej w maksymalną wartość ujemną, w wyniku czego spełniony zostanie warunek wyjścia (i < = -1).
pętla forEach
Podczas pracy z pętlami czasami trzeba iterować po tablicach lub kolekcjach. Zazwyczaj można iterować po tablicy za pomocą pętli for:public void printAllElements(String[] stringArray) {
for(int i = 0; i < stringArray.length; i++) {
System.out.println(stringArray[i]);
}
}
I to jest słuszne. Aby jednak iterować po wszystkich elementach tablicy, opracowano konstrukcję forEach. Jego podpis brzmi następująco:
for(<Тип element> <Nazwa переменной, куда будет записан очередной элемент> : <Название массива>) {
// Treść pętli
}
Możesz iterować po tablicy ciągów i drukować każdy z nich na konsoli w następujący sposób:
public void printAllElements(String[] stringArray) {
for(String s : stringArray) {
System.out.println(s);
}
}
Również krótko i zwięźle. Co najważniejsze, nie trzeba myśleć o liczniku i warunku wyjścia, wszystko jest już za nas zrobione.
Jak używane są pętle for
Przyjrzyjmy się teraz kilku przykładom użycia pętli for w Javie do rozwiązania różnych problemów.Cykl odwrotny (od większego do mniejszego)
for(int i = 5; i > 0; i--) {
System.out.println(i);
}
Wniosek:
5
4
3
2
1
Kilka zmiennych i zwiększanie licznika w treści pętli
W pętli for można używać wielu zmiennych, na przykład można je przekonwertować w instrukcji licznika:int a = 0;
for(int i = 5; i > 0; i--, a++) {
System.out.print("Krok: " + a + " Oznaczający: ");
System.out.println(i);
}
Wniosek:
Шаг: 0 Значение: 5
Шаг: 1 Значение: 4
Шаг: 2 Значение: 3
Шаг: 3 Значение: 2
Шаг: 4 Значение: 1
Lub zadeklaruj dwie zmienne i pętlę, aż będą sobie równe:
for(int i = 5, j = 11; i != j; i++, j--) {
System.out.println("i: " + i + " j: " + j);
}
Wniosek:
i: 5 j: 11
i: 6 j: 10
i: 7 j: 9
Jest mało prawdopodobne, aby to działanie miało jakąkolwiek wartość, ale warto wiedzieć o takiej możliwości. W pętli for można także tworzyć pętle wewnętrzne. W takim przypadku liczba kroków pętli zostanie pomnożona:
for(int i = 0; i < 5; i++) {
System.out.print(i + " | ");
for(int j = 0; j < 5; j++) {
System.out.print(j + " ");
}
System.out.print('\n');
}
Wniosek:
0 | 0 1 2 3 4
1 | 0 1 2 3 4
2 | 0 1 2 3 4
3 | 0 1 2 3 4
4 | 0 1 2 3 4
W pętli licznikowej j
możliwy jest dostęp do licznika pętli zewnętrznej. To sprawia, że zagnieżdżone pętle są idealnym sposobem na przechodzenie przez tablice dwuwymiarowe, trójwymiarowe i inne:
int[][] array = { {0, 1, 2, 3, 4 },
{1, 2, 3, 4, 5},
{2, 3, 4, 5, 6},
{3, 4, 5, 6, 7}};
for(int i = 0; i < array.length; i++) {
for(int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.print('\n');
}
Wniosek:
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
Wcześniejsze zakończenie cyklu
Jeśli chcesz przerwać pętlę podczas przetwarzania pętli, użyj operatorabreak
, który zatrzymuje bieżący korpus pętli. Wszystkie kolejne iteracje są również pomijane:
public void getFirstPosition(String[] stringArray, String element) {
for (int i = 0; i < stringArray.length; i++) {
if(stringArray[i].equals(element)) {
System.out.println(i);
break;
}
}
}
Metoda wypisze pozycję pierwszego szukanego elementu w tablicy:
String[] array = {"one", "two", "three", "Jeronimo"};
getFirstPosition(array, "two");
Wniosek:
1
Niekończący się cykl
Innym sposobem na utworzenie nieskończonej pętli for jest pozostawienie obszaru deklaracji licznika, warunku wyjścia i instrukcji licznika pustymi:for (;;) {
}
Należy jednak pamiętać, że w większości przypadków nieskończona pętla jest dowodem błędu logicznego. Taka pętla musi mieć warunek wyjścia.
GO TO FULL VERSION