Циклы в java
Цикл нужен, чтобы повторить действие несколько раз.
Классический цикл for, как в C++
В цикле for можно завести переменную, которая изменяется на каждой итерации цикла.
for (ИНИЦИАЛИЗАТОР ; УСЛОВИЕ ; ИТЕРАТОР) {
ТЕЛО ЦИКЛА
}
Например,
for (int x = 1; x <= 10; x = x + 1) { //или i++, i += 1
System.out.println(x);
// кстати, действие в теле цикла одно, можно без {}
}
Как это работает:
- Выполняется ИНИЦИАЛИЗАТОР. Переменные из инициализатора существуют только в блоке тела цикла.
- Проверяем УСЛОВИЕ. Если false, цикл заканчивается
- Выполняем ТЕЛО цикла
- Выполняется ИТЕРАТОР
- Возвращаемся к шагу 2.
В последнем примере:
- создаем x присваиваем 1
- 1 <= 10 условие верно
- Печатаем 1 (это тело цикла)
- x становится 2
- 2 <= 10 условие верно
- Печатаем 2 (это тело цикла)
- x становится 3
…
- x становится 9
- 9 <= 10 условие верно
- Печатаем 9 (это тело цикла)
- x становится 10
- 10 <= 10 условие верно
- Печатаем 10 (это тело цикла)
- x становится 11
- 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
Пример:
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.