Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Базовые типы

Замещающие типы
Без указателей
Массивы
Структурное программи-
рование

Обработка исключений
Возбуждение исключений
Классы обработки исключений
Блок finally
Строки String
Класс Math
Класс Vector
Класс Stack
Словарь на базе Hashtable
Словарь на базе Properties
Цифровые часы
Собственный класс
Наследование классов

Интерфейсы

Назад Вперед

1.4. Работа с массивами

В примере демонстрируются различные приемы работы с одномерными, многомерными и несимметричными массивами.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

Массивы в Java, как и во многих других языках программирования, обозначаются квадратными скобками. Эти скобки могут располагаться справа от имени массива или от типа объектов, из которых составлен массив. Заметим, что массив в языке Java может содержать не только переменные базовых типов, но и объекты произвольных классов.

При определении массива не резервируется память, поэтому размеры массива не указываются. Для резервирования памяти применяется ключевое слово new. После выполнения этой операции размер массива становится фиксированным.

Инициализация массива может быть как статической, так и динамической.

Массивы бывают многомерными и несимметричными.

Описание примера

В нашем примере демонстрируются различные методы работы с массивами - статическими, динамическими, многомерными и несимметричными.

Простой массив значений типа int

Внутри метода main мы объявили массив iNumbers, содержащий переменные базового типа int:

int[] iNumbers;

Как и полагается, размер массива не указан, так как при объявлении массива память для него не резервируется.

В следующей строке мы резервируем память для хранения 10 переменных типа int. Ссылку на эту память мы записываем в переменную iNumbers, завершая таким образом инициализацию массива:

iNumbers = new int[10];

Дополнительно мы объявляем переменную i, которая будет применяться для индексации этого и других массивов:

int i;

Запись значений в ячейки массива выполняется простым присваиванием в цикле:

for(i = 0; i < 10; i++)
  iNumbers[i] = i;

После завершения этого процесса программа отображает на консоли значения, хранящиеся в массиве:

System.out.print("iNumbers: [" 
  + iNumbers[0]); 
    
for(i = 1; i < iNumbers.length; i++)
  System.out.print("," + iNumbers[i]); 
      
System.out.println("]");

Здесь мы вначале выводим на консоль содержимое первого элемента массива, а затем и всех остальных.

Обратите внимание на то, как мы проверяем условие выхода за пределы массива. Параметр цикла i сравнивается со значением iNumbers.length.

Что это за значение?

Все массивы в Java являются объектами некоторого встроенного класса. Поле length этого класса содержит размер массива.

Массив объектов класса String

Ниже в примере показано, как можно выполнить статическую инициализацию массива, содержащего объекты встроенного класса String, предназначенного для работы с текстовыми строками:

String szLines[] =
{
  "This",
  "is",
  "Java",
  "String",
  "array"
};

Здесь одновременно с объявлением массива мы выполняем и его инициализацию.

Отображение элементов массива на консоли выполняется в цикле и не имеет никаких особенностей:

System.out.print(szLines[0]);
for(i=1; i<szLines.length; i++)
  System.out.print(" " + szLines[i]);

Многомерный массив объектов класса String

В следующем фрагменте кода мы объявляем двухмерный массив объектов класса String и сразу резервируем для него память:

String[][] szColors = new String[2][4];

Таким образом создается массив из двух строк и четырех столбцов.

Для работы со строками таблицы мы будем использовать переменную i, определенную ранее. Чтобы перебирать столбцы таблицы, в программе определена переменная j:

int j;

Массив szColors заполняется в двойном вложенном цикле:

for(i = 0; i < 2; i++)
  for(j = 0; j < 3; j++)
  {
    szColors[i][j] = 
      new String("Color (" + i + "," 
        + j + ")");
  }

При этом для каждой ячейки таблицы мы заказываем память оператором new.

Вывод содержимого таблицы на консоль выполняется также в двойном вложенном цикле, как это показано ниже:

for(i = 0; i < 2; i++)
  for(j = 0; j < 3; j++)
  {
    System.out.println(szColors[i][j]); 
  }

При определении массива szSounds мы задаем только количество строк:

String[][] szSounds = new String[2][];

Что же касается количества столбцов, то оно задается динамически при заполнении массива:

for(i = 0; i < szSounds.length; i++)
{
  szSounds[i] = new String[3];
  for(j = 0; j < szSounds[i].length; j++)
  {
    szColors[i][j] = 
      new String("Sound (" + i + "," 
        + j + ")");
  }     
}

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

for(i = 0; i < szSounds.length; i++)
  for(j = 0; j < szSounds[i].length; j++)
  {
    System.out.println(szColors[i][j]); 
  }

Обратите внимание на то, как мы проверяем границы массива. Количество строк у нас - это значение szSounds.length. Количество столбцов в строке определяется как szSounds[i].length. В случае симметричного массива szSounds оно одинаковое для каждой строки.

Несимметричный массив объектов класса String

Определяя несимметричный массив iAsymm, мы сначала не указываем, сколько в нем столбцов и строк:

String[][] iAsymm;

Далее при резервировании памяти для массива мы задаем только количество строк, равное двум:

iAsymm = new String[2][];

Затем в каждой строке задается разное количество столбцов: в первой строке - три столбца, а во второй - четыре:

iAsymm[0] = new String[3];
iAsymm[1] = new String[4];

Инициализируя несимметричный массив в двойном вложенном цикле мы не можем полагаться на то, что каждая строка содержит одинаковое количество столбцов. Поэтому предельное значение переменной внутреннего цикла определяется как iAsymm[i].length:

for(i = 0; i < iAsymm.length; i++)
{
  for(j = 0; j < iAsymm[i].length; j++)
  {
    iAsymm[i][j] = 
      new String("Asymm (" + i + "," 
        + j + ")");
  }     
}

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

Содержимое несимметричного массива распечатывается на консоли следующим образом:

for(i = 0; i < iAsymm.length; i++)
{
  for(j = 0; j < iAsymm[i].length; j++)
  {
    System.out.println(iAsymm[i][j]); 
  }     
 }
}

Здесь границы переменных внешнего и внутреннего циклов указаны как iAsymm.length и iAsymm[i].length, соответственно.

Результаты работы программы

Результаты работы нашей программы, выполняющей различные действия над массивами, показаны ниже:

iNumbers: [0,1,2,3,4,5,6,7,8,9]
This is Java String array

Colors array:
Color (0,0)
Color (0,1)
Color (0,2)
Color (1,0)
Color (1,1)
Color (1,2)

Sounds array:
Sound (0,0)
Sound (0,1)
Sound (0,2)
Sound (1,0)
Sound (1,1)
Sound (1,2)

Asymmetric array:
Asymm (0,0)
Asymm (0,1)
Asymm (0,2)
Asymm (1,0)
Asymm (1,1)
Asymm (1,2)
Asymm (1,3)

Назад Вперед

[Назад]