Перебор массива в Java. Основные способы перебора массива в Java на примерах

Нередко Java-программисту необходимо реализовать обработку таких наборов данных, как массивы и коллекции. Чаще всего речь идёт о переборе всех значений массива. В этой статье мы поговорим, как это делать стандартным и расширенным способом. И приведём соответствующие примеры.

Чтобы выполнить перебор массива в Java, применяют один из операторов цикла: for, while, do…while. В большинстве случаев используют именно for:

int aNums[] = { 2, 4, 6 };

for (int i = 0; i < aNums.length; i++) {
    String strToPrint = "aNums[" + i + "]=" + aNums[i];
}

Так как это стандартная операция, разработчики ввели дополнительный формат, обеспечивающий более рациональную и упрощённую реализацию перебора элементов в массиве Java. Эту реализацию можно сравнить с использованием цикла foreach в иных языках программирования. Некоторые называют её формой расширенного цикла for:

for (type variable : collection) {
    // некоторые операторы
    // ...
}

Что тут у нас есть: • type – тип внутренней переменной, имеющий имя variable; • variable – внутренняя переменная type-типа, видимая в границах блока фигурных скобок. Она итерационна и сохраняет элементы из набора данных collection; • collection – набор данных, перебираемых в цикле поочерёдно. И вот как раз в качестве набора таких данных может выступать и массив, и коллекция.

Итак, в расширенном цикле for на Java осуществляется последовательный перебор всех элементов массива либо коллекции. При этом число итераций цикла равняется числу элементов в массиве. На каждой итерации значение какого-нибудь элемента массива попадает в итерационную переменную variable, которую вы можете обрабатывать либо использовать. А цикл гарантирует, что произойдёт перебор или прохождение по всему массиву, начиная с первого элемента, заканчивая последним.

Давайте посмотрим, как это выглядит на примере.

Перебор массива чисел в Java

Продемонстрируем расширенный цикл for при обработке одномерного массива чисел типа int. В нашем примере реализован подсчёт количества парных чисел Java-массива:

// инициализируем одномерный массив A
int[] A = { 1, 8, 3, 6, 5, 10, 31 , 24, 10, 13, 2, 4 };
int k = 0; // число парных чисел

// расширенный цикл for
for (int d : A)
    if (d % 2 == 0)
        k++;
// k = 7

Перебор массива объектов в Java

Представьте, что у нас есть класс Book, реализующий книгу:

class Book {
    String title; // название 
    String author; // автор
    float price; // цена
    int year; // год выпуска
}

Давайте выполним перебор этого массива объектов, используя расширенный цикл for:

// объявляем одномерный массив типа Book
Book B[];

// выделяем память для массива из четырёх ссылок на тип Book
B = new Book[4];

// выделяем память для каждого элемента нашего массива 
for (int i=0; i<B.length; i++)
    B[i] = new Book();

// заполняем массив значениями
B[0].title = "Book-1";
B[0].author = "Author-1";
B[0].price = 205.78f;
B[0].year = 2008;

B[1].title = "Book-2";
B[1].author = "Author-2";
B[1].price = 99.00f;
B[1].year = 2010;

B[2].title = "Book-3";
B[2].author = "Author-3";
B[2].price = 0.99f;
B[2].year = 2011;

B[3].title = "Book-4";
B[3].author = "Author-4";
B[3].price = 100.01f;
B[3].year = 2012;

// выполняем поиск книг 2011-2012 гг
for (Book book : B)
    if ((book.year==2011)||(book.year==2012))
        System.out.println("Book: " + book.title + ", " + book.author);

Результат перебора этого массива объектов в Java будет следующим:

Book: Book-3, Author-3
Book: Book-4, Author-4

Перебор коллекции в Java

Также для примера продемонстрируем, как происходит обработка коллекции типа Integer посредством ArrayList. Как известно, класс нам ArrayList нам нужен для реализации динамического массива, способного увеличиваться либо уменьшаться по мере необходимости. Для использования этого класса следует подключить пакет java.util. Объявление класса ArrayList выглядит следующим образом:

class ArrayList<E>

Здесь E – это тип объектов, сохраняемых в массиве. Класс Integer является классом-оберткой над типом int и представляет целочисленные значения. В нашем примере класс ArrayList, обрабатывающий объекты типа Integer, имеет следующий вид:

class ArrayList<Integer>

Теперь давайте посмотрим на использование расширенного цикла for (одна из возможных реализаций):

// подключаем пакет java.util
import java.util.*;
...

ArrayList<Integer> A = new ArrayList<Integer>(); // создаём коллекцию

// добавляем элементы в коллекцию
A.add(5);
A.add(9);
A.add(-20);
A.add(11);
A.add(7); // A = { 5, 9, -20, 11, 7 }

// находим сумму элементов коллекции
int sum = 0;
    for (Integer i : A) // расширенный цикл for
        sum += i;

System.out.println("Sum = " + sum); // Sum = 12

Плюсы и минусы расширенного цикла for для Java-массивов

Применение расширенного цикла for имеет ряд преимуществ: • повышенная рациональность и упрощённость, если сравнивать со стандартным использованием цикла for; • отпадает необходимость в применении дополнительной переменной цикла, не надо задавать её начальное значение, как и условие завершения цикла; • массив индексировать тоже не нужно; • такой цикл очень удобен при обработке коллекций.

Но есть и недостаток, который связан с тем, что у нас отсутствует доступ к индексу массива. В результате у нас снижается гибкость в оперировании итерационной переменной. А это иногда нужно, допустим, если надо выполнить перебор не всех элементов массива или коллекции. К примеру, в некоторых случаях у программистов возникают задачи по перебору лишь первых n-элементов либо элементов, лежащих на определённых позициях (четных или нечётных). Правда, данный недостаток мы можем обойти, если введём дополнительные переменные-итераторы и проверку соответствующих условий. Тем не менее лучше всего этот способ подходит именно для обычного перебора всех элементов массива в Java.

Хотите знать больше? Приходите на профессиональный курс по Java-программированию в OTUS!

При подготовке статьи использовались следующие публикации: «Массив». «Расширенный цикл for в стиле foreach. Обработка массивов, коллекций объектов ArrayList».