Урок J-10. Массивы в Java

Массив (англ. Array) это объект, хранящий в себе фиксированное количество значений одного типа. Другими словами, массив — это нумерованный набор переменных. Переменная в массиве называется элементом массива, а ее позиция в массиве задается индексом. Например, нам нужно хранить  50 различных имен, согласитесь, неудобно для каждого имени создавать отдельную переменную, поэтому мы будем использовать массив. Нумерация элементов массива начинается с 0, а длинна массива устанавливается в момент его создания и фиксируется.

Для наглядности картинка, взятая мною с The Java Tutorial.

arrayДля того чтобы создать массив нужно его объявить, зарезервировать для него память и инициализировать.

 Объявление массива в Java

При создании массива в Java первым делом его нужно объявить. Это можно сделать следующим образом:

int[] myFirstArray;

Можно также объявить массив так:

int mySecondArray[];

Однако, это не приветствуется соглашением по оформлению кода в Java, поскольку скобки обозначают то, что мы имеем дело с массивом и логичнее, когда они находятся рядом с обозначением типа.

Исходя из данного примера, мы объявили 2 массива с именами myFirstArray и   mySecondArray.  Оба массива будут содержать элементы типа int.

Подобным образом можно объявить массив любого типа:

byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;
...

Тип массива задается следующим образом type[], где type это тип данных содержащихся в нем элементов. Скобки являются специальным обозначением того, что переменные содержатся в массиве. Имя массива может быль любым, однако, оно должно соответствовать правилам именования переменных.

Массивы можно создавать не только из переменных базовых типов, но и из произвольных объектов.

При объявлении массива в языке Java не указывается его размер и не резервируется память для него. Происходит лишь создание ссылки на массив.

 

Резервация памяти для массива и его инициализация.

Далее, для объявленного myFirstArray, зарезервируем память при помощи ключевого слова new.

int[] myFirstArray;
myFirstArray = new int[15];

В нашем примере мы создали массив из 15 элементов типа int и присвоили его ранее объявленной переменной myFirstArray.

Объявлять имя массива и резервировать для него память также можно на одной строке.

int[] myArray = new int[10];

При создании массива с помощью ключевого слова new,  все элементы массива автоматически инициализированы нулевыми значениями. Для того, чтобы присвоить элементам массива свои начальные значения, необходимо провести его инициализацию.  Инициализацию можно проводить как поэлементно

myFirstArray[0] = 10; // инициализация первого элемента
myFirstArray[1] = 20; // инициализация второго элемента
myFirstArray[2] = 30; // и т.д.

так и в цикле,  с помощью индекса проходя все элементы массива и присваивая им значения.

for(int i = 0; i < 15; i++){
    myFirstArray[i] = 10;
}

Как видно из предыдущих примеров, для того, чтобы обратиться к элементу массива, нужно указать его имя и, затем, в квадратных скобках — индекс элемента. Элемент массива с конкретным индексом ведёт себя также, как  и переменная.

Рассмотрим создание и инициализацию массива на следующем примере. В нем мы создаем массив, содержащий цифры 0-9 и выводим значения на консоль.

//создание и инициализация массива
int[] numberArray = new int[10];
for(int i = 0; i < 10; i++){
    numberArray[i] = i;
}
//вывод значений на консоль
for(int i = 0; i < 10; i++){
    System.out.println((i+1) + "-й элемент массива = " +  numberArray[i]);
}

 

Упрощенная форма записи

Для создания и инициализации массива можно также использовать упрощенную запись. Она не содержит слово new, а в скобках перечисляются начальные значения массива.

int[] myColor = {255, 255, 0};

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

 

Определение размера массива

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

myColor.length;

Данный код поможет нам узнать, что длина массива myColor равна 3.

Пример: Задано 4 числа, необходимо найти минимальное

int[] numbers = {-9, 6, 0, -59};
int min = numbers[0];
for(int i = 0; i < numbers.length; i++){
    if(min>numbers[i])
        min = numbers[i];
}

System.out.println(min);

Упражнения на тему одномерные массивы в Java:

  1. Создайте массив, содержащий 10 первых нечетных чисел. Выведете элементы массива на консоль в одну строку, разделяя запятой.
  2. Дан массив размерности N,  найти наименьший элемент массива и вывести на консоль (если наименьших элементов несколько — вывести их все).
  3. В массиве из задания 2. найти наибольший элемент.
  4. Поменять наибольший и наименьший элементы массива местами. Пример: дан массив {4, -5, 0, 6, 8}.  После замены будет выглядеть {4, 8, 0, 6, -5}.
  5. Найти среднее арифметическое всех элементов массива.

Комментарии и пинги к записи запрещены.

Комментариев к записи: 93

  1. Vlad:

    И снова здравствуйте! Похоже, не будет Вам покоя.
    Видимо, зря я сначала писал, а потом проверял, как работает, надежнее было бы проверять по блокам. В любом случае, ошибка вылезла там, где и не ожидал и как голову ни ломал — не понял причины. Перед тем, как писать, посмотрел варианты из комментариев, но это не прояснило, а вариант Юрия для меня вообще пока как высшая математика для начальных классов.
    Итак,
    http://pastebin.com/q0ch2kt8
    ошибку выдает на 12 строке
    number1[i] = j;
    при чем, j успешно вычисляется и контрольный вывод его значения проходит, а вот на этапе присвоения значения ячейке массива ошибка. Изменение имени массива результата не принесло (на всякий случай попробовал и это).
    Подскажите, пожалуйста, где ошибка.
    Спасибо!

    • Vlad:

      не заметил капчу.
      http://pastebin.com/tT1ZuP4q

    • Vlad:

      да, и ошибка:
      Exception in thread «main» java.lang.ArrayIndexOutOfBoundsException: 10
      at Test.main

    • Vlad:

      вывел для контроля значение i, так оно сразу принимает значение n.
      в таком случае причина возникновения ошибки понятна,нет такой ячейки в массиве, но почему цикл не работает от 0?

      • Мария (admin):

        У вас там одна ошибка, которая повторяется в нескольких местах. После for и условия в скобках, точку с запятой ставить не нужно!
        У вас так for(i = 0; i < n; i++);{ , а надо так for(i = 0; i < n; i++){ Ошибка номер 2, появится как только удалите все ";" после for: Вы создаете массивы int arrMin[] и int arrMax[] размерностью 0, и потом в эти массивы пытаетесь что-то записать... Я бы вам очень рекомендовала научиться дебаговать (отлаживать) и самостоятельно отлавливать ошибки, я не могу исправлять за вас все ошибки. Вот статья на английском по отладке в Eclipse или можете поискать что-то по этой теме сами.

        • Vlad:

          Спасибо большое, как-то непонятно влезли «;». убрал и ошибка ушла. до второй ошибки не дошел т.к. не пускала первая. мне надо было вставить только часть кода с ошибкой, чтобы не смущать и не отвлекать на остальную часть кода. отлавливаю и отлаживаю немало ошибок, обращаюсь только когда не удается самому.
          Что до массивов с размерностью 0 — позвольте не согласиться, там разница в одну букву между значениями размерности массивов MinN/MaxN и переменными MinNn/MaxNn, которым присваивается 0 для работы с массивами. А массивы создаются с размерностью переменных (к-во мин./макс. значений) MinN/MaxN, которые вычисляются ранее и их значение должны быть не менее 1. Видимо, и здесь надо быть аккуратнее с выбором имен, чтобы не вводить в заблуждение.
          А ошибка таки есть, но раньше, не с 0, а с присвоением значений в массиве через рандом. как-то странно, когда переменные int имеют значения типа 5-4, 10-8…. при статичном массиве ошибка пропадает. Буду разбираться далее.
          Еще раз спасибо. Простите за назойливость, более не смею отвлекать на свои ошибки.

          • Мария (admin):

            Вы конечно можете не соглашаться, но дебаггер мне подсказывает, что в момент создания массивов
            int arrMin[] = new int [minN];
            int arrMax[] = new int [maxN];

            minN и maxN равны нулю, а следовательно создаются массивы нулевой размерности. А нулю они равны, потому что у вас ошибка в предыдущем цикле. У вас написано minN = minN++; а нужно просто minN++; или minN = minN + 1;

          • Мария (admin):

            И еще, у вас потом дальше в коде, что значит запись
            j =
            number1[arrMin[i]] = max;

            ?

  2. Vlad:

    Мария, спасибо Вам большое! Я сделал две ошибки: отправил весь код вместо части, но все равно еще раз спасибо что не ограничились ответом на вопрос, а вторая и главная — что без проверки по блокам написал все, как лет двадцать тому назад на бейсике, а потом уже запускал. Здесь не все так просто по оформлению и пунктуации… опыт на будущее и сейчас буду отлавливать и исправлять. низкий поклон!

  3. Vlad:

    Исправил ошибки и поубирал несуразности. В результате получился рабочий код:
    3, 0, 15, 19, 14, 17, 14, 5, 10, 0, 19, 6, 19, 3, 15, 18, 10, 19, 11, 14, 0, 16, 8, 18, 10, 6, 6, 13, 7, 6, 5, 3, 7, 0, 9,
    min = 0,
    min = 0,
    min = 0,
    min = 0,

    max = 19
    3, 19, 15, 0, 14, 17, 14, 5, 10, 19, 0, 6, 0, 3, 15, 18, 10, 0, 11, 14, 19, 16, 8, 18, 10, 6, 6, 13, 7, 6, 5, 3, 7, 19, 9,
    Aver = 9

    Проверял на разных размерах массива, присвоение рандомом, замена мин-макс — массивами.
    Спасибо за терпение.

  4. Vlad:

    Сделал и рандом на значения <0, а вот чтобы среднее значение отображало корректную дробную часть — не получилось.

    -2, 0, 2, -8, -3, -6, 6, -7, -8, 2, -3, 15, -5, 6, -3, -2, -4, -8, -6, -7, -3, 5, 11, 13, 19, -5, 16, -3, -5, 6, -6, -4, 8, -6, -1,
    min = -8,
    min = -8,
    min = -8,
    max = 19
    -2, 0, 2, 19, -3, -6, 6, -7, 19, 2, -3, 15, -5, 6, -3, -2, -4, 19, -6, -7, -3, 5, 11, 13, -8, -5, 16, -3, -5, 6, -6, -4, 8, -6, -1,
    aver = 1.0

    Какой тип переменной надо указывать?

    • Мария (admin):

      Используйте тип double, только обратите внимание на то, чтобы у вас не только переменная aver была типа double, а так же в выражении, которое считает среднее арифметическое также хотябы одна переменная была типа double. Например avg = sum/array.length; Если переменная sum будет типа int, то у вас все расчеты будут без дробной части. Переопределить тип можно так avg = (double)sum/array.length;

  5. Vlad:

    Забыл сразу спросить, существует механизм ограничения к-ва символов в дробной части?

    • Мария (admin):

      Можно ограничить при выводе, делается это так http://pastebin.com/mT0Hvb9S устанавливаете там только вместо 2 такое количество символов, которое вам нужно. Но внимание на то, что в итоге число преобразится в строку String. Сам по себе double ограничить нельзя, он будет таким длинным, каков он есть.

Все материалы сайта study-java.ru являются результатом труда его авторов. Копирование материалов в некоммерческих целях без указания источника в виде прямой ссылки на сайт study-java.ru запрещено. Использование материалов в коммерческих целях разрешено только с письменного согласия автора. Нарушение авторских прав преследуется по закону.