Изучаем Java

Вы здесь: Главная >> Java-учебник >> Неровные массивы в Java

Неровные массивы в Java


"Неровные" массивы в Java

До сих пор все, что мы рассматривали, не отличалось от других языков программирования. Однако в языке Java есть средства, предоставляющие совершенно новые возможности: в нем вообще нет многомерных массивов, только одномерные. Многомерные массивы лишь имитируются как "массивы массивов"..
Например, массив balance в предыдущем примере фактически представляет собой массив, состоящий из 10 элементов, каждый из которых является массивом из шести чисел с плавающей точкой (рис. 3.16).
 


Рис 3.16. Двухмерный массив.

 

Выражение balance [i] относится к i-му подмассиву, т.е i-й строке таблицы. Эта строка представляет собой массив, и выражение balance [i] относится к j-му элементу этого массива.
Поскольку к строкам массива открыт самостоятельный доступ, их можно легко переставлять!

double[] temp = balance [ i] ;
balance [i] = balance [i+1] ;
balance[i=l] = temp;

Кроме того, в языке Java легко создавать "неровные" массивы, т.е массивы, у которых разные строки имеют разную длину. Приведем стандартный пример. Создадим массив, в котором элемент, стоящий на пересечении i-й строки и столбца, равен количеству возможностей "выбрать j чисел среди i лотерейных номеров".

1
1          1
1          2          1                                
1          3          3          1                     
1          4          6          4          1         
1          5          10        10        5          1
1          6          15        20        15        6

 

Поскольку число j не может превышать i, получается треугольная матрица. В i-й строке этой матрицы стоит i+1 элементов. (Мы можем выбрать и 0 элементов; сделать это можно лишь одним-единственным способом.) Чтобы создать неровный массив, сначала разместим в памяти массив, хранящий его строки.

int[] [] adds = new int [nmax+1] [] ;

Затем поместим туда сами строки.

for (n=0; n<=NMAX; n++) adds [n] = new int[n + l];

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

for (n=0; n<odds.length; n++)
for (k=0; k<odds[n].length; k++)
// Вычисление шансов.
} adds[n][k] = lotteryOdds;

В листинге 3.9 приведен полный текст этой программы.

В языке Java объявление

double[][] balance - new double[10[6]; // Java
не эквивалентно объявлению
double balance[10][6]; // С++
и даже не соответствует объявлению
double (*balance)[6] = new double[10][6]; // C++

Вместо этого в памяти размещается массив, состоящий из десяти указателей:

double** balance = new double*[10]; // C++
Затем каждый элемент в массиве указателей заполняется массивом, состоящим из 6 чисел.

for (i = 0 ; i < 10; i + + )
balance [i] = new double [ 6] ;

К счастью, этот цикл выполняется автоматически при объявлении массива с помощью оператора new double [10] [6]. Если вам нужны "неровные" массивы, размещайте массивы строк отдельно.

Листинг 3.9. Программа LotteryArray.java
 


Партнеры сайта