- Способы перебора списка в Java
- 2. для цикла
- 2.1. Базовый цикл _
- 2.2. Улучшено для цикла
- 3. Итераторы
- 3.1. Итератор
- 3.2. ListIterator
- 4. для каждого()
- 4.1. Итерабельный.для каждого()
- 4.2. Stream.forEach()
- 5. Вывод
- The for Statement
- Цикл For в Java
- Что такое циклы for?
- Принцип работы цикла for
- Цикл forEach
- Как используются циклы for
- Обратный цикл (от большего к меньшему)
- Несколько переменных и увеличение счетчика в теле цикла
- Досрочное завершение цикла
- Бесконечный цикл
Способы перебора списка в Java
Перебор элементов списка — одна из самых распространенных задач в программе.
В этом руководстве мы рассмотрим различные способы сделать это в Java. Мы сосредоточимся на переборе списка по порядку, хотя и в обратном порядке тоже несложно.
2. для цикла
Во-первых, давайте рассмотрим некоторые параметры цикла for .
Мы начнем с определения списка стран для наших примеров:
ListString> countries = Arrays.asList("Germany", "Panama", "Australia");
2.1. Базовый цикл _
Наиболее распространенным оператором управления потоком для итерации является базовый цикл for .
Цикл for определяет три типа операторов, разделенных точкой с запятой. Первый оператор является оператором инициализации. Второй определяет условие завершения. Последнее утверждение — это предложение обновления.
Здесь мы просто используем целочисленную переменную в качестве индекса:
for (int i = 0; i countries.size(); i++) System.out.println(countries.get(i)); >
При инициализации мы должны объявить целочисленную переменную, чтобы указать начальную точку. Эта переменная обычно действует как индекс списка.
Условие завершения — это выражение, которое возвращает логическое значение после оценки. Как только это выражение становится ложным, цикл завершается.
Предложение update используется для изменения текущего состояния индексной переменной, увеличения или уменьшения его до точки завершения.
2.2. Улучшено для цикла
Усовершенствованный цикл for представляет собой простую структуру, которая позволяет нам обращаться к каждому элементу списка. Он похож на базовый цикл for, но более удобочитаем и компактен. Следовательно, это одна из наиболее часто используемых форм для обхода списка.
Обратите внимание, что расширенный цикл for проще, чем базовый цикл for :
for (String country : countries) System.out.println(country); >
3. Итераторы
Итератор — это шаблон проектирования, который предлагает нам стандартный интерфейс для обхода структуры данных, не беспокоясь о внутреннем представлении.
Этот способ обхода структур данных дает много преимуществ, среди которых мы можем подчеркнуть, что наш код не зависит от реализации.
Следовательно, структура может быть бинарным деревом или двусвязным списком, поскольку Итератор абстрагирует нас от способа выполнения обхода. Таким образом, мы можем легко заменить структуры данных в нашем коде без неприятных проблем.
3.1. Итератор
В Java шаблон Iterator отражен в классе java.util.Iterator . Он широко используется в коллекциях Java . В Iterator есть два ключевых метода: hasNext() и next() .
Здесь мы продемонстрируем использование обоих:
IteratorString> countriesIterator = countries.iterator(); while(countriesIterator.hasNext()) System.out.println(countriesIterator.next()); >
Метод hasNext() проверяет , остались ли какие-либо элементы в списке .
Метод next() возвращает следующий элемент итерации .
3.2. ListIterator
ListIterator позволяет нам перемещаться по списку элементов в прямом или обратном порядке.
Прокрутка списка с помощью ListIterator вперед следует механизму, аналогичному тому, который используется с помощью Iterator . Таким образом, мы можем переместить итератор вперед с помощью метода next() и найти конец списка с помощью метода hasNext() .
Как мы видим, ListIterator очень похож на итератор , который мы использовали ранее:
ListIteratorString> listIterator = countries.listIterator(); while(listIterator.hasNext()) System.out.println(listIterator.next()); >
4. для каждого()
4.1. Итерабельный.для каждого()
Начиная с Java 8, мы можем использовать метод forEach() для перебора элементов списка . Этот метод определен в интерфейсе Iterable и может принимать лямбда-выражения в качестве параметра.
countries.forEach(System.out::println);
До появления функции forEach все итераторы в Java были активны, то есть они включали цикл for или while, который обходил сбор данных до тех пор, пока не выполнялось определенное условие.
С введением forEach в качестве функции в интерфейсе Iterable все классы, реализующие Iterable , имеют добавленную функцию forEach .
4.2. Stream.forEach()
Мы также можем преобразовать набор значений в поток и получить доступ к таким операциям, как forEach() , map() и filter().
Здесь мы продемонстрируем типичное использование потоков:
countries.stream().forEach((c) -> System.out.println(c));
5. Вывод
В этой статье мы продемонстрировали различные способы перебора элементов списка с помощью Java API. Эти параметры включали цикл for , расширенный цикл for , Iterator , ListIterator и метод forEach() (включенный в Java 8).
Затем мы узнали, как использовать метод forEach() с потоками .
Наконец, весь код, используемый в этой статье, доступен в нашем репозитории Github .
The for Statement
The for statement provides a compact way to iterate over a range of values. Programmers often refer to it as the «for loop» because of the way in which it repeatedly loops until a particular condition is satisfied. The general form of the for statement can be expressed as follows:
for (initialization; termination; increment) < statement(s) >
When using this version of the for statement, keep in mind that:
- The initialization expression initializes the loop; it’s executed once, as the loop begins.
- When the termination expression evaluates to false , the loop terminates.
- The increment expression is invoked after each iteration through the loop; it is perfectly acceptable for this expression to increment or decrement a value.
The following program, ForDemo , uses the general form of the for statement to print the numbers 1 through 10 to standard output:
The output of this program is:
Count is: 1 Count is: 2 Count is: 3 Count is: 4 Count is: 5 Count is: 6 Count is: 7 Count is: 8 Count is: 9 Count is: 10
Notice how the code declares a variable within the initialization expression. The scope of this variable extends from its declaration to the end of the block governed by the for statement, so it can be used in the termination and increment expressions as well. If the variable that controls a for statement is not needed outside of the loop, it’s best to declare the variable in the initialization expression. The names i , j , and k are often used to control for loops; declaring them within the initialization expression limits their life span and reduces errors.
The three expressions of the for loop are optional; an infinite loop can be created as follows:
The for statement also has another form designed for iteration through Collections and arrays This form is sometimes referred to as the enhanced for statement, and can be used to make your loops more compact and easy to read. To demonstrate, consider the following array, which holds the numbers 1 through 10:
The following program, EnhancedForDemo , uses the enhanced for to loop through the array:
class EnhancedForDemo < public static void main(String[] args)< int[] numbers = ; for (int item : numbers) < System.out.println("Count is: " + item); >> >
In this example, the variable item holds the current value from the numbers array. The output from this program is the same as before:
Count is: 1 Count is: 2 Count is: 3 Count is: 4 Count is: 5 Count is: 6 Count is: 7 Count is: 8 Count is: 9 Count is: 10
We recommend using this form of the for statement instead of the general form whenever possible.
Цикл For в Java
Говорят, что лучший программист — ленивый программист. Вместо того, чтобы совершать однотипные действия по нескольку раз, он придумает алгоритм, который сделает эту работу за него. А еще он сделает его хорошо, чтобы не нужно было переделывать. Примерно так, чтобы много раз не писать один и тот же код, придумали циклы. Представим, что нам нужно вывести в консоль числа от 0 до 99. Код без цикла:
System.out.println(0); System.out.println(1); System.out.println(2); System.out.println(3); System.out.println(4); System.out.println(5); // И так далее
Что такое циклы for?
- Приготовить стакан.
- Открыть крышку.
- Получить 1 каплю.
- Получить 2 каплю. …
- Получить 30 каплю.
- Закрыть лекарство.
- Принять полученную порцию.
- Приготовить стакан.
- Открыть крышку капель.
- Получить 30 капель.
- Закрыть лекарство.
- Принять полученную порцию.
Принцип работы цикла for
for(; ; ) < // Тело цикла >Пример перебора цифр от 0 до 5 и вывод каждой в консоль: for(int i = 0; i
Если перевести данную запись на человеческий язык, получится следующее: “Создай переменную i с начальным значением 0, пока она не достигнет 5, прибавляй к ней по 1 и на каждом шаге записывай значение i в консоль.” В основе работы цикла for в Java лежат три стадии, их можно изобразить следующей схемой: Условие выхода из цикла — это булево выражение. Если оно ложно, цикл будет завершен. В примере выше переменная i увеличивается на 1. Если ее значение менее 5, цикл продолжается. Но как только i станет больше или равно 5, цикл прекратится. Оператор счетчика — выражение, которое выполняет преобразование переменной счетчика. В примере выше переменная i увеличивалась на 1. То есть цикл будет выполнен ровно 5 раз. Если оператор счетчика будет прибавлять по 2 к переменной i , результат будет иным:
Также можно умножать переменную, делить, возводить в степень, в общем, делать все, что угодно. Главное, чтобы в результате преобразования получилось число. Тело цикла — любой код, который может быть выполнен. В примере выше в теле цикла был вывод значения переменной i в консоль, однако содержимое данного тела ограничено задачей и фантазией. Обобщая всю схему, принцип данного цикла — for — следующий: код, который находится в теле цикла, будет выполнен столько раз, сколько преобразований выполнит оператор счетчика до того, как будет достигнуто условие выхода из цикла. Если задать условие выхода из цикла как true :
for(int i = 0; true; i++) < if(i % 1000000 == 0) System.out.println(i); >System.out.println("Loop ended");
То код после цикла будет помечен ошибкой unreachable statement , так как никогда не будет исполнен. Задача на смекалку: в результате запуска кода ниже будет ли выведено в консоль “ Loop ended ” или цикл будет выполняться бесконечно?
for(int i = 0; i > -1; i++) < if(i % 1000000 == 0) System.out.println(i); >System.out.println("Loop ended");
Ответ: будет. Переменная i рано или поздно достигнет максимального значения, а дальнейшее увеличение превратит ее в максимальное отрицательное, в результате чего условие выхода будет выполнено (i < = -1).
Цикл forEach
При работе с циклами иногда приходится перебирать массивы или коллекции. Обычно массив можно перебрать с помощью цикла for:
public void printAllElements(String[] stringArray) < for(int i = 0; i < stringArray.length; i++) < System.out.println(stringArray[i]); >>
И это правильно. Однако, для перебора всех элементов массива по очереди придумали конструкцию forEach. Ее сигнатура следующая:
public void printAllElements(String[] stringArray) < for(String s : stringArray) < System.out.println(s); >>
Тоже кратко и лаконично. Самое главное, нет нужды думать о счетчике и об условии выхода, все уже сделано за нас.
Как используются циклы for
А теперь рассмотрим несколько примеров использование цикла for в Java для решения разнообразных задач.
Обратный цикл (от большего к меньшему)
Несколько переменных и увеличение счетчика в теле цикла
В цикле for можно использовать несколько переменных, например их можно преобразовывать в операторе счетчика:
int a = 0; for(int i = 5; i > 0; i--, a++)
Шаг: 0 Значение: 5 Шаг: 1 Значение: 4 Шаг: 2 Значение: 3 Шаг: 3 Значение: 2 Шаг: 4 Значение: 1
for(int i = 5, j = 11; i != j; i++, j--)
i: 5 j: 11 i: 6 j: 10 i: 7 j: 9
Вряд ли это действие имеет какую-либо ценность, но знать о такой возможности полезно. В цикле for также можно создавать внутренние циклы. В этом случае количество шагов цикла будет умножаться:
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'); >
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
В цикле со счетчиком j есть возможность обращаться к счетчику внешнего цикла. Благодаря этому вложенные циклы — идеальный способ обхода двумерного, трехмерного и прочих массивов:
int[][] array = < , , , >; 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'); >
0 1 2 3 4 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7
Досрочное завершение цикла
Если при обработке цикла нужно его прервать, используйте оператор break , который останавливает работу текущего тела цикла. Все последующие итерации также пропускаются:
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; >> >
String[] array = ; getFirstPosition(array, "two");
Бесконечный цикл
Еще один способ создать бесконечный цикл for — оставить пустой область объявления счетчика, условие выхода и оператор счетчика:
Но учти, что в большинстве случаев бесконечный цикл — свидетельство логической ошибки. У такого цикла обязательно должно быть условие выхода.