Главная страница

АБОБА. Справочник по программированию на Java Методическое пособие


Скачать 242.41 Kb.
НазваниеСправочник по программированию на Java Методическое пособие
АнкорАБОБА
Дата20.02.2022
Размер242.41 Kb.
Формат файлаdocx
Имя файла12642_java_method_1.docx
ТипСправочник
#368066
страница26 из 67
1   ...   22   23   24   25   26   27   28   29   ...   67

Версия “for-each” цикла for


Как вам, возможно, известно, в современной теории языков программирования все большее применение находит концепция циклов “for-each”, которые быстро становится стандартными функциональными возможностями во многих языках. Цикл в стиле “for-each” предназначен для строго последовательного выполнения повторяющихся действий по отношению к коллекции объектов, такой как массив. В отличие некоторых языков, подобных C#, в котором для реализации циклов “for-each” используют ключевое слово foreach, в Java возможность применения цикла “for-each” реализована за счет усовершенствования цикла for. Преимущество этого подхода состоит в том, что для его реализации не требуется дополнительное ключевое слово, и никакой ранее существовавший код не разрушается. Цикл for в стиле “for-each” называют также усовершенствованным циклом for. Общая форма версии “for-each” цикла for имеет следующий вид:

for(тип итерационной-переменной : коллекция) блок-операторов

Здесь тип указывает тип, а итер-пер – имя итерационной переменной, которая последовательно будет принимать значения из коллекции, от первого до последнего. Элемент коллекция указывает коллекцию, по которой должен выполняться цикл. С циклом for можно применять различные типы коллекций, но в этой главе мы будем использовать только массивы. (Другие типы коллекций, которые можно применять с циклом for, вроде определенных в каркасе коллекций Collection Framework, рассматриваются в последующих главах книги.) На каждой итерации цикла программа извлекает следующий элемент коллекции и сохраняет его в переменной итер-пер. Цикл выполняется до тех пор, пока не будут получены все элементы коллекции. Поскольку итерационная переменная получает значения из коллекции, тип должен совпадать (или быть совместимым) с типом элементов, хранящихся в коллекции. Таким образом, при выполнении цикла по массивам тип должен быть совместим с базовым типом массива.

Чтобы понять побудительные причины применения циклов в стиле “for-each”, рассмотрим тип цикла for, для замены которого предназначен этот стиль. В следующем фрагменте для вычисления суммы значений элементов массива применяется традиционный цикл for:

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

int sum = 0;

for(int i=0; i < 10; i++) sum += nums[i];

Чтобы вычислить сумму, мы последовательно считываем значения каждого из элементов массива nums. Таким образом, чтение всего массива выполняется строго последовательно. Это выполняется путем индексации массива nums вручную по управляющей переменной цикла i.

Цикл for в стиле “for-each” позволяет автоматизировать этот процесс. В частности, применение такого цикла позволяет не устанавливать значение счетчика цикла за счет указания его начального и конечного значений, и исключает необходимость индексации массива вручную. Вместо этого программа автоматически выполняет цикл по всему массиву, последовательно получая значения каждого из его элементов, от первого до последнего. Например, с учетом версии “for-each” цикла for предыдущий фрагмент можно переписать следующим образом:

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

int sum = 0;

for(int x: nums) sum += x;

При каждом прохождении цикла переменной x автоматически присваивается значение, равное значению следующего элемента массива nums. Таким образом, на первой итерации x содержит 1, на второй – 2 и т.д. При этом не только упрощается синтаксис программы, но и исключается возможность ошибок выхода за пределы массива.

Ниже показан пример полной программы, иллюстрирующей применение описанной версии “for-each” цикла for.

// Использование цикла for в стиле for-each.

class ForEach {

public static void main(String args[]) {

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

int sum = 0;

// использование стиля for-each для отображения и суммирования значений

for(int x : nums) {

System.out.println("Значение равно: " + x);

sum += x;

}

System.out.println("Сумма равна: " + sum);

}

}

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

Значение равно: 1

Значение равно: 2

Значение равно: 3

Значение равно: 4

Значение равно: 5

Значение равно: 6

Значение равно: 7

Значение равно: 8

Значение равно: 9

Значение равно: 10

Сумма равна: 55

Как видно из этого вывода, оператор for в стиле “for-each” автоматически выполняет цикл по элементам массива, от наименьшего индекса к наибольшему.

Хотя повторение цикла for в стиле “for-each” выполняется до тех пор, пока не будут обработаны все элементы массива, цикл можно прервать и раньше, используя оператор break. Например, следующая программа суммирует значения пяти первых элементов массива nums.

// Использование оператора break в цикле for в стиле for-each.

class ForEach2 {

public static void main(String args[]) {

int sum = 0;

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

// использование цикла for для отображения и суммирования значений

for(int x : nums) {

System.out.println("Значение равно: " + x);

sum += x;

if(x == 5) break; // прекращение цикла после получения 5 значений

}

System.out.println("Сумма пяти первых элементов равна: " + sum);

}

}

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

Значение равно: 1

Значение равно: 2

Значение равно: 3

Значение равно: 4

Значение равно: 5

Сумма пяти первых элементов равна: 15

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

При использовании цикла в стиле “for-each” необходимо помнить о следующем важном обстоятельстве. Его итерационная переменная является переменной “только для чтения”, поскольку она связана только с исходным массивом. Операция присваивания значения итерационной переменной не оказывает никакого влияния на исходный массив.

Иначе говоря, содержимое массива нельзя изменять, присваивая новое значение итерационной переменной. Например, рассмотрим следующую программу:

// Переменная цикла for-each доступна только для чтения.

class NoChange {

public static void main(String args[]) {

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

BookNew_JAVA-7.indb 130 02.06.2007 1:06:45

Глава 5. Управляющие операторы 131

for(int x : nums) {

System.out.print(x + " ");

x = x * 10; // этот оператор не оказывает никакого влияния на массив nums

}

System.out.println();

for(int x : nums)

System.out.print(x + " ");

System.out.println();

}

}

Первый цикл for увеличивает значение итерационной переменной на 10. Однако эта операция присваивания не оказывает никакого влияния на исходный массив nums, как видно из результата выполнения второго оператора for. Генерируемый программой вывод подтверждает сказанное:

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10
1   ...   22   23   24   25   26   27   28   29   ...   67


написать администратору сайта