Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 3. Типы данных, переменные и массивы

// Улучшенная версия предыдущей программы, class AutoArray {

public static void main(String args[]) {

int month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } ; System.out.printIn("Апрель содержит " + month_days[3] + " дней."); } }

Когда вы выполните эту программу, то увидите тот же самый вывод, как у предыдущей версии программы.

Java делает строгие проверки, чтобы удостовериться, что вы случайно не пробуете сохранять или читать значения вне области хранения массива. Ис­полнительная система Java тоже делает тщательные проверки, чтобы убе­диться, что все индексы массивов находятся в правильном диапазоне. (В этом отношении Java существенно отличается от языков C/C++, которые не обеспечивают проверки границ во время выполнения.) Например, исполни­тельная система будет проверять значение каждого индекса в month_days, чтобы удостовериться, что он находится между 0 и 11 включительно. Если вы попробуете обратиться к элементам вне диапазона массива (индекс меньше нуля или больше, чем длина массива), то вызовете ошибку времени выполнения.

Имеется еще один пример, который использует одномерный массив. Он находит среднее значение набора чисел.

// Среднее значение элементов массива. class Average {

public static void main (String args [ ] ) {

double nums[] = {10.1, 11.2, 12.3, 13.4, 14.5};

double result = 0;

int i ;

for(1=0; i<5; i++)

result = result + nums[i];

System.out.println("Среднее арифметическое равно " + result / 5); }

}

Многомерные массивы

В Java многомерные массивы — это, фактически, массивы массивов. Они выглядят и действуют подобно регулярным многомерным массивам. Однако имеется пара тонких различий. Чтобы объявить многомерную переменную массива, определите каждый дополнительный индекс, используя другой на-

76

Часть I. Язык Java

бор квадратных скобок. Например, следующее утверждение объявляет пере­менную двумерного массива с именем twoD:

int twoD [ ] [ ] = new int [ 4 ] [ 5 ] ;

Оно распределяет память для массива 4x5 и назначает ее переменной twoD. Внутренне эта матрица реализована как массив массивов целых чисел тип int. Концептуально этот массив будет выглядеть, как показано на рис. 3.1.

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

// Демонстрирует двумерный массив . class TwoDArray {

public static void main (String args [ ] ) {

int twoD[] []= new int [4] [5] ;

int i , j , k = 0 ;

for(i=0; i<4; i++)

for(j=0; j<5; j++) { twoD[i] [j] = k; k++; }

for(i=0; i<4; i++) { for(j=0; j<5; j++)


Рис. 3.1. Концептуальный вид двумерного массива 4x5


System.out.print(twoD[i][j] + " "); System.out.println(); } } \

Глава 3. Типы данных, переменные и массивы _ 77_ Эта программа генерирует следующий вывод:

01234

56789

10 11 12 13 14

15 16 17 18 19

Когда вы распределяете память для многомерного массива, нужно специфи­цировать только первое (крайнее левое) измерение. Остающиеся измерения можно распределять отдельно. Например, в следующем тексте память рас­пределяется только для первого измерения переменной twoD (когда она объ­является). Распределение для второго измерения выполняется вручную:

int twoD [ ] [ ] = new int [ 4 ] [ ] ; twoD[0] = new int [5]; twoD[1] = new int [5] ; twoD[2] = new int [5]; twoD[3] = new int [5] ;

Хотя в этой ситуации нет никакого преимущества для индивидуального рас­пределения массивов второго измерения, но оно может появиться в других случаях. Например, когда вы распределяете измерения вручную, не нужно распределить то же самое число элементов для каждого измерения. Как за­явлено ранее, многомерные массивы — фактически массивы массивов, дли­на каждого массива находится под вашим управлением. Например, следую­щая программа создает двумерный массив, который для разных строк имеет разное количество столбцов.

// Ручное распределение различных размеров второго измерения. class TwoDAgain { public static void main (String args [] ) (

int twoD[] [] = new int[4][];

twoD[0] = new int[l];

twoD[l] = new int[2];

twoD[2] = new int[3];

twoD[3] = new int[4];

int i, j, k = 0;

for(i=0; i<4; i++)

for(j=0; j<i+l; j++) {

twoD[i] [j] = k;

k++; }

for(1=0; i<4; i++) { for(j=0; j<i+l; j++)

System.out.print(twoD[i][j] + " ");

78 Часть I. Язык Java

System.out.println(); } } }

Эта программа генерирует следующий вывод:

о

12

345 6789

Массив, созданный этой программой, выглядит так, как показано на рис. 3.2.

Рис. 3.2. "Неровный" массив

Использование неровных (или нерегулярных) многомерных массивов не рекомендуется для большинства приложений, потому что они ведут себя противоположно тому, что люди ожидают, когда сталкиваются с много­мерным массивом. Однако в некоторых ситуациях их можно использовать эффективно. Например, если вы нуждаетесь в очень большом двухмерном массиве, который редко заполнен (т. е. в котором не все элементы будут содержать ненулевые значения), то нерегулярный массив мог бы быть под­ходящим решением.

Многомерные массивы возможно инициализировать. Для этого просто включают инициализатор каждого измерения в его собственный набор фи­гурных скобок. Следующая программа создает матрицу, где каждый элемент содержит произведение индексов строки и столбца. Также обратите внима­ние, что внутри инициализаторов массива вы можете использовать как вы­ражения, так и литеральные значения.

// Инициализирует двумерный массив, class Matrix {

public static void main(String args[]) { double m[][] = {

{ 0*0, 1*0, 2*0, 3*0 }, { 0*1, 1*1, 2*1, 3*1 }, { 0*2, 1*2, 2*2, 3*2 }, { 0*3, 1*3, 2*3, 3*3 } }; int i, j;

Соседние файлы в папке JavaLit