Массивы, обработка элементов массива
Представьте себе такую задачу. Вам нужно хранить в памяти компьютера значения линейной функции при . Как это сделать? Мы умеем создавать отдельные переменные, но тогда здесь нам понадобится 100 переменных, с которыми надо будет еще как-то управляться. Но, к счастью, все можно сделать гораздо проще. Можно задать массив из 100 элементов и в каждый элемент массива записать значение функции при конкретном значении x.
Итак, чтобы задать массив в языке Java используется такой синтаксис:
Например, в нашем случае следует выбрать вещественный тип данных для элементов массива. Имя массива обозначим как и функцию y:
и далее можем создать массив со 100 элементами с помощью оператора new:
Эти две строчки можно объединить в одну и записать все так:
Все, мы создали массив. Теперь, чтобы в его первый элемент записать первое значение функции, используется такой синтаксис:
Здесь k, b – переменные с какими-либо значениями, а x=0. Обратите внимание, первый элемент массива всегда имеет индекс, равный нулю. По аналогии, записывается значение во второй элемент массива:
и так далее. Давайте напишем целиком программу, которая заносит все 100 значений в массив и выводит их на экран.
Обратите внимание, если мы хотим прочитать значение из массива, то достаточно просто обратиться к нему по соответствующему индексу, например, так:
В результате переменная a будет равна 6-му значению элемента массива y. Поэтому, когда мы пишем
то осуществляется вывод элемента массива с индексом x. Вот так можно записывать и считывать значения из массива.
В языке Java можно сразу инициализировать массив конкретными значениями в момент его объявления, например, так:
int powers[] = new int[] {1, 2, 4, 6};
В этом случае элементу powers[0] присваивается значение 1, powers[1] – 2, и т.д. Обратите внимание, что в этом случае нигде не должен указываться размер массива. Его размер определяется числом инициализируемых элементов.
Выведем этот массив в консоль:
Смотрите, здесь для определения числа элементов в массиве использовалось его свойство length. То есть, индекс последнего элемента в массиве всегда равен length-1. Например, вывести только последний элемент нашего массива можно так:
System.out.println(powers[powers.length-1]);
Для хранения некоторых видов информации, например, изображений удобно пользоваться двумерными массивами. Объявление двумерных массивов осуществляется следующим образом:
int ar2D[][] = new int[3][4]; int array2D[][] = { { 0, 1, 2 }, { 3, 4, 5 } };
Какой индекс здесь считать строками, а какой – столбцами, решает сам программист, компьютер все равно будет обрабатывать элементы этого массива в соответствии с программой и что такое строки и столбцы ему неведомо.
Здесь также, первый элемент массива имеет индексы 0, то есть,
array2D[0][0] = 1; //в первый элемент записано число 1
array2D[0][1] = 2; array2D[1][0] = 3;
и так далее. Давайте в качестве примера напишем программу, которая бы записывала в массив E размерностью 10×10 такие значения:
final int N = 10; int E[][] = new int[N][N]; for(int i = 0;i N;++i) for(int j = 0;j N;++j) if(i == j) E[i][j] = 1; else E[i][j] = 0; for (int i = 0; i N; ++i) { for (int j = 0; j N; ++j) System.out.print(E[i][j]+" "); System.out.print("\n"); }
Также в Java можно создавать так называемые многомерные зубчатые массивы. Визуально такой двумерный массив можно представить вот в таком виде:
short z[][] = new short[5][]; z[0] = new short[3]; z[1] = new short[4]; z[2] = new short[2]; z[3] = new short[3]; z[4] = new short[1];
Для обработки элементов такого массива можно записать такие циклы:
short cnt = 1; for(int i = 0;i z.length;++i) for(int j = 0;j z[i].length;++j) { z[i][j] = cnt; cnt++; } for(int i = 0;i z.length;++i) { for (short val : z[i]) System.out.print(val + " "); System.out.print("\n"); }
Смотрите, что здесь получается. Вот это свойство z.length возвращает первую размерность массива, то есть 5. Далее, мы берем i-ю строку (либо столбец в зависимости от интерпретации) и узнаем сколько элементов в этой строке. И внутри второго цикла записываем туда значение cnt, которое постоянно увеличивается на 1.
Затем, мы выводим полученный массив в консоль. Здесь также сначала перебираем первую его размерность. А вот этот цикл перебирает по порядку все элементы i-й строки и помещает их в переменную val. Обратите внимание на его синтаксис:
Вот так можно перебирать элементы любой коллекции, в данном случае строки массива. Вот так все это работает. По аналогии можно задавать массивы любой размерности.
Обработка элементов массива
- Удаление значения из массива по определенному индексу.
- Вставка значения в массив по определенному индексу.
- Сортировка элементов массива.
final int N = 9; short a[] = new short[N];
for(int i=0;i N;++i) a[i] = (short)(i+1);
Теперь удалим элемент со значением 6. Для этого нужно проделать такую операцию: Причем, сначала перемещаем 7-ку на место 6-ку, затем 8-ку и 9-ку, то есть, двигаемся от удаляемого элемента к концу массива. Программа будет выглядеть так:
Здесь мы начали движение с 5-го индекса (то есть 6-го элемента массива) и на первой итерации делаем операцию a[5]=a[6], то есть, 7-ку ставим на место 6-ки. На следующей итерации уже имеем a[6]=a[7] – перемещаем 8-ку и, затем, a[7]=a[8] – перемещаем 9-ку. Все, в итоге значение 6 было удалено из массива. Теперь реализуем второй алгоритм и вставим значение 4, которого не хватает вот в таком массиве:
short a[] = new short[] {1, 2, 3, 5, 6, 7, 8, 9, 9};
Здесь в конце записаны две 9, чтобы мы могли сдвинуть все элементы на 1 вправо и вставить элемент со значением 4. То есть, нам следует выполнить такую операцию над элементами массива: Обратите внимание, что сдвиг осуществляется с конца массива. Если мы начнем это делать с 4-го, то просто затрем все остальные значения пятеркой. Итак, вот программа, которая вставляет 4-ку в этот массив:
Здесь счетчик i в цикле сначала равен 8 – это индекс последнего элемента нашего массива. Затем, делается операция a[i]=a[i-1], то есть, a[8]=a[7]. Таким образом, мы присваиваем 8-му элементу значение 7-го элемента. Это и есть смещение значения вправо. На следующей итерации i уменьшается на 1, то есть, равно 7 и операция повторяется: a[7]=a[6] и так далее, последний смещаемый элемент будет: a[4]=a[3]. После этого i будет равно 3, условие цикла становится ложным и он завершается. После смещения, мы присваиваем 4-му элементу массива значение 4 и выводим получившийся массив на экран. Теперь рассмотрим довольно распространенный алгоритм сортировки элементов массива по методу всплывающего пузырька. Реализуем его на языке Java.
Здесь первый цикл показывает с какого элемента искать минимальный, то есть, это местоположение той вертикальной черты в методе всплывающего пузырька. Затем, задаем две вспомогательные переменные min – минимальное найденное значение, pos – индекс минимального элемента в массиве. Второй вложенный цикл перебирает все последующие элементы массива и сравнивает его с текущим минимальным и если будет найдено меньшее значение, то min становится равной ему и запоминается его позиция. Вот эти три строчки меняют местами текущее значение элемента с найденным минимальным, используя вспомогательную переменную t. И в конце программы выполняется вывод элементов массива на экран. Запустим эту программу и посмотрим как она работает. Кстати, если мы теперь хотим выполнить сортировку по убыванию, то достаточно изменить вот этот знак на противоположный.
Перебор массива в Java. Основные способы перебора массива в Java на примерах
Нередко Java-программисту необходимо реализовать обработку таких наборов данных, как массивы и коллекции. Чаще всего речь идёт о переборе всех значений массива. В этой статье мы поговорим, как это делать стандартным и расширенным способом. И приведём соответствующие примеры.
Чтобы выполнить перебор массива в Java, применяют один из операторов цикла: for, while, do…while. В большинстве случаев используют именно for:
int aNums[] = < 2, 4, 6 >; for (int i = 0; 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, реализующий книгу:
Давайте выполним перебор этого массива объектов, используя расширенный цикл for:
// объявляем одномерный массив типа Book Book B[]; // выделяем память для массива из четырёх ссылок на тип Book B = new Book[4]; // выделяем память для каждого элемента нашего массива for (int i=0; iРезультат перебора этого массива объектов в Java будет следующим:
Book: Book-3, Author-3 Book: Book-4, Author-4Перебор коллекции в Java
Также для примера продемонстрируем, как происходит обработка коллекции типа Integer посредством ArrayList. Как известно, класс нам ArrayList нам нужен для реализации динамического массива, способного увеличиваться либо уменьшаться по мере необходимости. Для использования этого класса следует подключить пакет java.util. Объявление класса ArrayList выглядит следующим образом:
Здесь E – это тип объектов, сохраняемых в массиве. Класс Integer является классом-оберткой над типом int и представляет целочисленные значения. В нашем примере класс ArrayList, обрабатывающий объекты типа Integer, имеет следующий вид:
Теперь давайте посмотрим на использование расширенного цикла for (одна из возможных реализаций):
// подключаем пакет java.util import java.util.*; . ArrayList A = new ArrayList(); // создаём коллекцию // добавляем элементы в коллекцию 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!