Циклы в java

Цикл нужен, чтобы повторить действие несколько раз.

Классический цикл for, как в C++

В цикле for можно завести переменную, которая изменяется на каждой итерации цикла.

for (ИНИЦИАЛИЗАТОР ; УСЛОВИЕ ; ИТЕРАТОР) {
    ТЕЛО ЦИКЛА
}

Например,

for (int x = 1; x <= 10; x = x + 1) { //или i++, i += 1
    System.out.println(x);
    // кстати, действие в теле цикла одно, можно без {}
}

Как это работает:

  1. Выполняется ИНИЦИАЛИЗАТОР. Переменные из инициализатора существуют только в блоке тела цикла.
  2. Проверяем УСЛОВИЕ. Если false, цикл заканчивается
  3. Выполняем ТЕЛО цикла
  4. Выполняется ИТЕРАТОР
  5. Возвращаемся к шагу 2.

В последнем примере:

  1. создаем x присваиваем 1
  2. 1 <= 10 условие верно
  3. Печатаем 1 (это тело цикла)
  4. x становится 2
  5. 2 <= 10 условие верно
  6. Печатаем 2 (это тело цикла)
  7. x становится 3

  1. x становится 9
  2. 9 <= 10 условие верно
  3. Печатаем 9 (это тело цикла)
  4. x становится 10
  5. 10 <= 10 условие верно
  6. Печатаем 10 (это тело цикла)
  7. x становится 11
  8. 11 <= 10 условие НЕВЕРНО. конец

Итого, распечатались числа от 1 до 10.

Еще пример:

for (int i = 0, j = 10 ; i <= j ; i += 1, j -= 1)
    sout(String.format("i = %d, j = %d", i, j));

Подумаем, что выведется. В начале тела цикла (если мы не изменяем переменные цикла в теле), условие на эти переменные верно. Распечатается:

i = 0, j = 10
i = 1, j = 9
i = 2, j = 8
i = 3, j = 7
i = 4, j = 6
i = 5, j = 5

После этого i становится 6, j становится 4, условие нарушилось, цикла заканчивается.

Еще примеры, стандартные циклы:

i++ это добавление 1, i--.

for (int i = 0; i < n; i++)  // перебор i от 0 до n-1
for (int i = 1; i <= n; i++)  // перебор i от 1 до n
for (int i = n; i >= 0; i--) // перебор i от n до 1 обратно

Перерыв 5 минут.

Цикл while

Обычно for используется, когда заранее известно, сколько раз надо повторять действия. А while нужен, если действия повторяются, пока выполняется какое-то условие.

while (УСЛОВИЕ) {
    ТЕЛО цикла
    // если ТЕЛО из одного оператора, можно без {}
}

Выполняется

  1. Проверяется условие. Если неверно, цикл заканчивается
  2. Выполяется ТЕЛО
  3. Вернуться на шаг 1

Пример:

int i = 1;
while (i <= 10) {
    sout(i);
    i++;
}

Выведутся числа 1, 2, 3, 4 … 10, после цикла значение переменной i будет равно 11. В for после цикла переменная недоступна.

Частый пример while:

while (true) {  // while (2 == 2)
}

Это бесконечный цикл. Например, мы просим пользователя вводить с клавиатуры команды, и останавливаемся только, когда он ввел команду stop.

Чтобы выйти из цикла, используйте оператор break: (подходит для for тоже)

int i = 0;
while (true) {
    i++;
    if (i == 10)
        break; // (!) оператор выхода из цикла
    sout(i);
}

Выведется: 1, 2, 3, …, 9.

Действия со строками String

В действиях со строками считаем, что строки — объекты, действия — вызов методов. Синтаксис аналогичен python.

String s = "abc xyz"; //строка из 7 символов
sout(s.length()); //метод length() объекта s
s.startsWith("abc"); //проверяет, начинается ли строка с этой строки. Здесь результат true

Как и в pyhton, результаты вызова методов можно использовать в выражениях:

sout(s.length() * 2); // 14
if (s.startsWith("abc"))
    sout("Это строка начинается на abc");

Подстроки (то, для чего в python есть [:])

String s = "abc xyz";
s.substring(2, 5); //это эквивалентно в Python s[2:5]
                   //получим "c x".
s.substring(2); //начиная со 2, эквивалентно s[2:]

Если нужно взять символ из строки, то метод charAt:

String s = "abc xyz";
sout(s.charAt(0)); // тип char, получаем 'a'
sout(s.charAt(3)); // тип char, получаем ' '
sout(s.substring(0, 1)); //тип String, получаем "a"

Шаблон, как перебрать все буквы строки. Приходится использовать обычный for:

String s = "Какая-то строка";
for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    sout(c);
}

Где посмотреть все методы класса String: String, java docs 17.

Нашелся способ форматирования строк лучше, чем String.format() из конца прошлой лекции.

Было:

int x = 10
String.format("x = %d", x); // "x = 10"

Стало:

int x = 10
"x = %d".formatted(x); // "x = 10"

Это похоже на метод .format() в Python.

Сравнение строк, метод equals

Строки в Java можно сравнивать через обычный оператор сравнения ==. Но делать это не нужно! (никогда) Потому что это такое же сравнение, как сравнение is в Python: сравнивается не содержимое строк, а совпадают ли объекты.

String s1 = "abc";
String s2 = "abc";
String s3 = "xabc".substring(1); //вырезаем "abc"

System.out.println(s1 == s2); // совпало !! true
System.out.println(s1 == s3); // не совпало!! false

Надо использовать equals

String s1 = "abc";
String s2 = "abc";
String s3 = "xabc".substring(1); //вырезаем "abc"

System.out.println(s1.equals(s2)); // совпало !! true
System.out.println(s1.equals(s3)); // не совпало!! false
System.out.println("abc".equals("a" + "bc")); //true

Итого, == в Java это is в Python.