Обход массивов
| English | Русский |
|---|---|
| traversal/træˈvɜːsl/ | обход |
| enhanced for loop/enˈhænst fɔː luːp/ | расширенный цикл for |
Обход каждого элемента
- Обход посещает каждый элемент массива, обычно по порядку.
- Стандартный индексированный цикл:
for (int i = 0; i < a.length; i++) { ... a[i] ... } iперебирает от0доlength - 1, поэтомуa[i]обращается к каждому элементу один раз.- Обход является основой любого алгоритма для работы с массивами.
Цикл for-each
- Улучшенный цикл for (for-each) для посещения каждого значения без использования индекса:
for (int x : a) { ... x ... }—xпоследовательно получает значение каждого элемента.- Более чистый вариант, когда нужны только значения, а не их позиции.
- Но он не может изменять массив или использовать индекс.
Индексированный цикл против for-each
- Используйте индексированный цикл, когда вам нужна позиция
iили необходимо изменить элементы. - Используйте цикл for-each, если нужно просто прочитать каждое значение.
a[i] = 0;требует индексированного цикла; суммирование значений можно выполнять через for-each.- Оба варианта посещают все элементы — выберите тот, который подходит для задачи.
Границы снова
- Условие индексированного цикла
i < a.lengthсохраняет корректностьi. i <= a.lengthвыходит за пределы на единицу → ArrayIndexOutOfBoundsException.- Цикл for-each не может выйти за границы — он сам управляет диапазоном.
- Когда вы пишете индекс самостоятельно, вы несете ответственность за границы.
Цикл for-each читает значения, но не может записать их обратно в массив. Изменения for (int x : a) { x = 0; } затрагивают только локальную копию x, не a — чтобы занулить массив, необходим индексированный цикл a[i] = 0;. Используйте for-each для чтения, индексированный цикл для изменения или когда вам нужна позиция i.
Два способа сложить элементы массива:
- Индексированный:
for (int i = 0; i < a.length; i++) { sum += a[i]; } - For-each:
for (int x : a) { sum += x; } - Оба дают одинаковую сумму; for-each чище, если индекс не нужен.
Обход (traversal) посещает каждый элемент. Индексированный цикл (for (int i = 0; i < a.length; i++)) дает позицию i и позволяет изменять a[i]; цикл for-each (for (int x : a)) чисто читает каждое значение, но не может изменить массив или использовать индекс. Выбирайте в зависимости от того, нужен ли вам индекс или необходимость изменения.
Обход массива для суммирования
i посещает каждый индекс; sum накапливает a[i] (здесь a = {10,20,30}).
Правильное условие для обхода массива a с использованием индекса...
Допустимые индексы от 0 до length-1, поэтому i < a.length.
Какой цикл следует использовать, если нужно ИЗМЕНЯТЬ элементы массива?
for-each не может записать обратно; используйте a[i] = ... с индексированным циклом.
В for (int x : a) { x = 0; }, массив a устанавливается во все нули.
x — локальная копия; массив не меняется.
For-each цикл for (int x : a) лучше всего подходит, когда нужно только...
for-each чисто читает значения без использования индекса.
Посещение каждого элемента массива называется ___ (одно слово).
Обход (traversal) посещает каждый элемент.