Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Герберт Шилдт. Java 2, v5.0 (Tiger). Новые возм...doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
1.21 Mб
Скачать

Обработка многомерных массивов в цикле

Улучшенная версия цикла for может применяться для обработки многомерных массивов (multidimensional array).

Напоминаю, что в языке Java многомерные массивы представляют собой массивы массивов (arrays of arrays) (например двухмерный массив — это массив из одномерных массивов). Это важно при циклической обработке многомерного массива, так как в каждом проходе цикла извлекается следующий массив, а не отдельный элемент. Более того, тип переменной цикла в цикле for должен быть совместим с типом получаемого массива. Например, в случае двухмерного массива переменная цикла должна быть ссылкой на одномерный массив. Вообще при использовании цикла for в стиле for-each для обработки массива с N измерениями получаемые объекты должны быть массивами с N-1 измерениями. Для того чтобы лучше понять смысл этого рассмотрим программу, приведенную в листинге 4.4. В ней применены вложенные циклы for для получения всех элементов двухмерного массива в порядке их следования в строках

Листинг 4.4. Использование цикла for в стиле for-each для обработки двухмерного массива

class ForEach3 {

public static void main(String args[]) {

int sum = 0;

int nums[][] = new int[3][5];

// give nums some values

for(int i = 0; i < 3; i++)

for(int j=0; j < 5; j++)

nums[i][j] = (i+1)*(j+1);

// use for-each for to display and sum the values

for(int x[] : nums) {

for(int y : x) {

System.out.println("Value is: " + y);

sum += y;

}

}

System.out.println("Summation: " + sum);

}

}

Далее приведен вывод результатов работы программы из листинга 4.4:

Value is: 1

Value is: 2

Value is: 3

Value is: 4

Value is: 5

Value is: 2

Value is: 4

Value is: 6

Value is: 8

Value is: 10

Value is: 3

Value is: 6

Value is: 9

Value is: 12

Value is: 15

Summation: 90

В листинге 4.4 обратите особое внимание на следующую строку:

for(int x[] : nums) {

Посмотрите, как определена переменная цикла, х. Это ссылка на одномерный массив целых чисел. Подобное объявление необходимо, так как в каждом проходе цикла for извлекается следующий массив из двухмерного массива nums, начиная с массива заданного как nums[0]. Внутренний цикл for затем просматривает каждый из этих массивов, отображая значения каждого элемента.

Область применения цикла for в стиле for-each

Поскольку цикл for в стиле for-each может обрабатывать массив только последовательно от начала к концу, Вы можете подумать, что область его применения ограничена, но это неверно. Множество алгоритмов нуждается именно в такой обработке. Один из наиболее общих примеров — поиск. В программе, приведенной в листинге 4.5, цикл for используется для поиска значения в не отсортированном массиве. Цикл прерывается, когда искомое значение найдено.

Листинг 4.5. Поиск в массиве с помощью цикла for в стиле for - each

class Search {

public static void main(String args[]) {

int nums[] = { 6, 8, 3, 7, 5, 6, 1, 4 };

int val = 5;

boolean found = false;

// use for-each style for to search nums for val

for(int x : nums) {

if(x == val) {

found = true;

break;

}

}

if(found)

System.out.println("Value found!");

}

}

Цикл for в стиле for-each — отличный выбор для приложения из листинга 4.5, поскольку поиск в не отсортированном массиве подразумевает последовательную проверку каждого элемента (конечно, если массив отсортирован, можно применить двоичный поиск, который потребует применения цикла другого стиля). К другим типам приложений, выигрывающих от использования цикла for в стиле for-each, относятся вычисление среднего арифметического, поиск минимального или максимального значения в наборе, поиск дублирующих значений и т. д.