Вы здесь: Главная >> 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
Сергей Владимирцев
19.02.2011