Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Еще один распространенный вариант использования циклов на массивах — агрегация. Агрегацией являются любые вычисления, которые строятся на основе всего набора данных. Например, поиск максимального, среднего, суммы и так далее. Рассмотрим пример поиска максимального значения:

    public static int max(int[] ar) {
        if (ar.length == 0)
            throw new IllegalArgumentException("Can't find maximum of empty array");

        int max = ar[0];

        for (int i : ar) {
            max = Math.max(max, i);
        }

        return max;
    }

Алгоритм поиска максимального числа в массиве выглядит так:

  • Если массив пустой, то выбрасываем исключение. Это не самый лучший вариант и дальше мы познакомимся с и с самими исключениями, и с тем, как сделать лучше. Но исключения, к сожалению, используются повсеместно и знать о них нужно.
  • В ином случае берем за точку отсчета первый элемент массива и считаем его максимальным.
  • Обходим массив(можно начать со второго элемента) и берем максимальное значение между известным и текущим элементом, при нахождении большего элемента он запишется в переменную max.
  • После обхода возвращаем результат.

Главное, что нужно увидеть в этом коде — место определения переменной max. Новички часто забывают про то, что переменную нужно определить до её использования. Внутри цикла переменные определять нельзя. Это нужно делать до цикла. В большинстве языков переменные, определенные внутри блока кода (тело цикла в нашем случае) видны только внутри этого блока, то есть их область видимости ограничивается блоком кода. Соответственно, получить доступ к этим переменным вне блока невозможно, например чтобы вернуть max из функции в конце.

Обратите внимание, что начальным значением max взят первый элемент, а не, скажем, 0. Ведь может оказаться так, что все числа в массиве меньше 0, и тогда мы получим неверный ответ.

Второй важный момент: возврат делается только после обхода всего массива. Если бы return был внутри цикла, то массив не был бы рассмотрен целиком. Такая ошибка часто встречается у новичков.

Нейтральный элемент

Рассмотрим поиск суммы:

    public static int sum(int[] ar) {
        int sum = 0;

        for (int i : ar) {
            sum += i;
        }

        return sum;
    }

Алгоритм поиска суммы значительно проще, но обладает парой важных нюансов.

Чему равна сумма элементов пустого массива? С точки зрения математики такая сумма равна 0. Что в принципе совпадает со здравым смыслом. Если у нас нет яблок, значит у нас есть 0 яблок (количество яблок равно нулю).

Второй момент связан с начальным элементом суммы. В коде используется 0 или так называемый нейтральный элемент операции сложения на множестве вещественных чисел. Нейтральный элемент бинарной операции — элемент, который ничего не меняет в результате его использования в бинарной операции. По простому, сложение любого числа с нулем всегда дает это же число. Тогда любую сумму, например 3 + 2 + 8, можно вычислить как 0 + 3 + 2 + 8, чем мы и пользуемся в нашем коде.

Агрегация далеко не всегда означает что, коллекция элементов сводится к некоторому простому значению. Результатом агрегации может быть сколь угодно сложная структура, например, массив. Подобные примеры часто встречаются в реальной жизни и будут ещё рассмотрены позже.

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →