АБОБА. Справочник по программированию на Java Методическое пособие
Скачать 242.41 Kb.
|
Итерация в многомерных массивахУсовершенствованная версия цикла for применима также и к многомерным массивам. Однако следует помнить, что в Java многомерные массивы состоят из массивов массивов. Это важно при выполнении итерации в многомерном массиве, поскольку результат каждой итерации – следующий массив, а не отдельный элемент. Более того, тип итерационной переменной цикла for должен быть совместим с типом получаемого массива. Например, в случае двумерного массива итерационная переменная должна быть ссылкой на одномерный массив. В общем случае при использовании цикла “for-each” для выполнения итерации в массиве размерности N получаемые объекты будут массивами размерности N-1. Дабы понять, что из этого следует, рассмотрим следующую программу. В ней вложенные циклы for служат для получения упорядоченных по строкам элементов двумерного массива. // Использование цикла for в стиле for-each применительно к двумерному массиву. class ForEach3 { public static void main(String args[]) { int sum = 0; int nums[][] = new int[3][5]; // присвоение значений элементам массива nums for(int i = 0; i < 3; i++) for(int j=0; j < 5; j++) nums[i][j] = (i+1)*(j+1); // использование цикла for в стиле for-each для отображения // и суммирования значений for(int x[] : nums) { for(int y : x) { System.out.println("Значение равно: " + y); sum += y; } } System.out.println("Сумма: " + sum); } } Эта программа генерирует следующий вывод: Значение равно: 1 Значение равно: 2 Значение равно: 3 Значение равно: 4 Значение равно: 5 Значение равно: 2 Значение равно: 4 Значение равно: 6 Значение равно: 8 Значение равно: 10 Значение равно: 3 Значение равно: 6 Значение равно: 9 Значение равно: 12 Значение равно: 15 Сумма: 90 Следующая строка этой программы заслуживает особого внимания: for(int x[] : nums) { Обратите внимание на способ объявления переменной x. Эта переменная – ссылка на одномерный массив целочисленных значений. Это необходимо потому, что результат выполнения каждой итерации цикла for – следующий массив в массиве nums, начиная с массива, указанного элементом nums[0]. Затем внутренний цикл for выполняет итерацию по каждому из этих массивов, отображая значения каждого из элементов. Использование усовершенствованного цикла forПоскольку каждый оператор for в стиле “for-each” может выполнять цикл по элементам массива только последовательно, начиная с первого и заканчивая последним, может показаться, что его применение ограничено. Однако это не так. Множество алгоритмов требуют использования именно этого механизма. Одним из наиболее часто используемых алгоритмов является поиск. Например, следующая программа использует цикл for для поиска значения в неупорядоченном массиве. Поиск прекращается после обнаружения искомого значения. // Поиск в массиве с применением цикла 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; // использование цикла for в стиле for-each для в nums значения val for(int x : nums) { if(x == val) { found = true; break; } } if(found) System.out.println("Значение найдено!"); } } В данном случае выбор стиля “for-each” для цикла for полностью оправдан, поскольку поиск в неупорядоченном массиве предполагает последовательный просмотр каждого из элементов. (Конечно, если бы массив был упорядоченным, можно было бы использовать бинарный поиск, реализация которого требовала бы применения другого стиля цикла.) К другим типам приложений, которым применение циклов в стиле “for-each” предоставляет преимущества, относятся вычисление среднего значения, отыскание минимального или максимального значения в наборе, поиск дубликатов и т.п. Вложенные циклыПодобно всем другим языкам программирования, Java допускает использование вложенных циклов. То есть один цикл может выполняться внутри другого. Например, в следующей программе использованы вложенные циклы for: // Циклы могут быть вложенными. class Nested { public static void main(String args[]) { int i, j; for(i=0; i<10; i++) { for(j=i; j<10; j++) System.out.print("."); System.out.println(); } } } Эта программа генерирует следующий вывод: .......... ......... ........ ....... ...... ..... .... ... .. . |