Как работает цикл for в java. Циклы

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

В языке Java есть несколько способов создать циклы. Как Вы уже могли догадаться, мы будем рассматривать их все.

Первый способ объявить цикл — это использовать такую конструкцию: for (условие начала цикла; условие конца; шаг, с которым будет идти цикл) { тело цикла }

Перейдем сразу к примерам. Допустим у нас есть задача вывести фразу «привет мир» 10 раз. Если не использовать циклы, то можно просто написать System.out.println(«Привет мир»); десять раз и решим задачу. Давайте же для это цели используем циклы. Создайте новый класс и назовите его например CuclesInJava. Теперь объявите условие цикла (пусть это будет 0), условие конца — 10, и шаг. Будем идти с шагом в единицу. В тело цикла поместите строку System.out.println(«Привет мир»);

Вот пример кода:

Результатом такого кода будет 10 строк подряд фразы «Hello world!».

Как насчет написать что то более сложное. Мы уже выучили и базовые . Давайте их и используем.

Напишем простое приложение, которое будет выводить строку с оповещением каждый раз, когда шаг + некоторая переменная будет равна 5. У меня очень плохо с фантазией))

Для начала напишем код, который будет принимать на вход переменную введенную из консоли. В предыдущей статье, я давал пример этого кода и мы условились, что потом я объясню, как он работает и откуда пошел. А сейчас мы просто будем им пользоваться:

Далее нужно написать цикл, который будет начинаться с нуля и считать до десяти (как в предыдущем примере). В тело цикла запишем условный оператор, который будет проверять, является эта переменная равна 5 и если это так, то будем выводить строку «ОК». Вот, что у меня получилось:

    import java.util.Scanner ;

  1. public class CuclesInJava {

    int variable = scanner.nextInt () ; //мы дойдем до этого постепенно и тогда будет понятно, как это работает

  2. for (int i = 1 ; i < 10 ; i++ ) {

    int newVariable = i + variable;

    if (newVariable== 5) {

Получилось не очень замысловато. Этим примером, я хотел показать, как можно использовать циклы с ветвлениями в связке.

Следующим способом объявить циклы является конструкция: while(условие истинно){блок кода, который нужно выполнить}. У данной конструкции есть другая форма:

do{блок кода, который нужно выполнить}while(условие истинно). Отличие первого от второго в том, что второе выполнить один цикл независимо истинно условие или нет. Можете сами подумать: сначала мы выполняем кода, а потом уже проверяем условие. И даже если условие будет не истинным, код все равно выполниться один раз, в том время, когда в первом виде конструкции сначала проверяется условие и пока оно не будет истинным, код не выполнится.

Код должен быть интуитивно понятен. Думаю, стоит упомянуть, что с помощью конструкций while и do-while можно «зациклить» программу если не прописать или неправильно прописать условие выхода из цикла. Посмотрите на пример выше и подумайте, что было, если бы я написал не i—, а i++; или вместо i>0, i<0. Моя программа никогда не вышла бы из цикла и продолжала бы выводить строку Hello world! до тех пор, пока не завис компьютер. Поэтому, будьте очень осторожными с циклами и всегда следите, чтобы из них Ваша программа могла выйти или закончить работу.

Ну и пример с do-while:

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

В Java, как и практически в любом языке программирования, имеются инструменты для обеспечения многократного повторения определенного фрагмента кода, или, как их принято называть, циклов. Циклы в Java представлены такими операторами, как for и while, а также их разновидностями. Как правило, циклы используются для прохода по одномерным и многомерным массивам и итерируемым структурам данных (в т.ч. коллекциям) с целью нахождения определенных элементов и дальнейших операций с ними. Однако это не единственный способ применения такого инструмента, как цикл Java. Примеры использования будут приводиться по мере их рассмотрения.

Java: описание и примеры

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

while(условие) {

//тело цикла

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

Если в теле цикла заключен всего один оператор, то фигурные скобки можно не ставить, однако считается хорошим тоном, если они стоят всегда. На рисунке выше представлена блок-схема работы данного оператора.

Для наглядности давайте разберем пример, представленный на рисунке ниже:

Объявленная переменная count изначально имеет значение 1. Далее мы видим логическое выражение, заключенное в скобки после названия оператора. Оно будет истинным, т.е. возвращать значение true, до тех пор, пока значение переменной count будет меньше или равно 10. В теле цикла с каждым проходом (итерацией) значение переменной увеличивается на 1 и выводится на консольный экран. Обратите внимание на то, что когда значение переменной достигло 11, цикл прекратил работу.

Если бы значение переменной count изначально равнялось 11, то условие цикла было бы ложным, и программа даже не зашла бы в его тело.

Стоит отметить, что синтаксис Java позволяет использовать оператор while без тела. Приведем пример. Допустим, у нас есть две переменные i = 100 и j = 200, перед нами стоит задача программно вычислить их среднее арифметическое - для этого можно использовать «пустотелый» while:

while(++i < --j);

В результате значение любой из двух переменных будет равно среднему их изначальных значений. Как видите, цикл прекрасно отработал без тела и выполнил все необходимые действия в условном выражении.

Цикл do-while

В предыдущих примерах если условное выражение изначально возвращало значение false, то выполнение программы проигнорировало бы тело цикла и пошло дальше. Однако часто возникают ситуации, в которых выполнение кода, содержащегося в теле цикла, обязательно хотя бы единожды независимо от истинности условного выражения. Иными словами бывает так, что проверять истинность условного выражения требуется не в начале, а в конце цикла. Такую функциональность может обеспечить разновидность цикла while под названием do-while. Он имеет следующую форму:

do {
//тело цикла

} while(условие);

Как мы видим, сначала на выполнение идет тело цикла, и лишь потом проверяется истинность условия - и так каждую итерацию.

Код, приведенный выше, отработает примерно так же, как в случае с обычным while. Однако если бы мы присвоили переменной count значение 11, тело цикла все равно выполнилось бы один раз, перед тем как оператор смог проверить истинность выражения.

Описание и примеры for - Java цикл

Представляет собой универсальную и эффективную языковую форму в Java. До пятой версии Java SDK была только одна традиционная форма оператора for, а после появилась новая - for each. В данном разделе мы ознакомимся с традиционной формой оператора. for Java цикл имеет следующий вид:

Перед тем как управление передастся коду в теле цикла, сначала выполняется инициализация переменной i, выступающей в качестве счетчика. Далее проверяется условное выражение, в котором счетчик сравнивается с определенным значением, и если оно возвращает true, тело цикла выполняется. Затем значение счетчика изменяется на заранее заданный шаг и опять проверяется условное выражение, и так до тех пор, пока условие не станет ложным. Блок-схема ниже иллюстрирует все этапы работы цикла.

Для лучшего понимания приведем пример того, как работает for Java цикл:

Мы видим, что в качестве счетчика используется переменная loopVal. После каждой итерации цикла ее значение будет прирастать на 1, и это будет происходить до тех пор, пока оно не достигнет 11. Обратите внимание, что управляющую переменную можно объявлять и за пределами оператора for, но если вы не собираетесь использовать эту переменную нигде кроме как в цикле, рекомендуется объявлять ее непосредственно в операторе. Имейте в виду, что объявленная в самом операторе переменная имеет область видимости в пределах этого самого цикла.

Бывают ситуации, когда требуется объявить несколько управляющих циклом переменных. For Java цикл позволяет указывать две и более переменные через запятую, причем делать это как при их инициализации, так и при итерации. Такой оператор будет иметь следующий вид:

for(int i = 1, int j = 10; i < j; ++i, --j) {}

При каждой итерации значение переменной i будет увеличиваться на 1, а значение переменной j уменьшаться на 1. Итерации будут выполняться до тех пор, пока i не станет больше или равно j.

Особенности применения оператора for

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

boolean exit = false;

for (int i = 0; !exit; ++i) {

На примере выше мы можем наблюдать, как работа цикла абсолютно не зависит от управляющей переменной i и количество итераций зависит исключительно от того, в какой момент переменная exit примет значение true. Более того управляющую переменную можно и вовсе убрать из цикла и это никак не отразится на его работе: for(; !exit;) {}. Хотя это и не самый разумный способ программирования, иногда это может быть полезным. Главное - предусмотреть ситуацию, в которой переменная примет нужное для выхода из цикла значение, чтобы не превратить его в бесконечный.

For Java цикл может быть объявлен и таким способом: for(; ;) {}. Это типичный пример бесконечного цикла с особыми условиями прерывания. О том, каким же образом прерывать такого рода циклы, мы поговорим немного позже.

Цикл в стиле for each

Цикл foreach Java всегда применяется для последовательного перебора элементов массива или какой-либо и выполнения над ними определенных повторяющихся операций. Пример данной формы оператора for представлен ниже:

В качестве итерационной переменной объявляется name, а объявленный ранее массив строк names выступает вторым аргументом оператора. Переменная name будет поочередно принимать значения каждого элемента массива, пока все его элементы не будут извлечены. Следует отметить, что тип переменной должен быть совместимым с типом элементов, которые хранятся в массиве. Также переменная name доступна исключительно для чтения и попытка ее изменения не приведет к изменению самого элемента в массиве.

Операторы прерывания цикла

Существует три оператора прерывания цикла: break, return и continue. Первые два способны полностью прервать работу цикла, а continue прерывает лишь работу текущей итерации. Если вы используете в своем коде умышленно бесконечный цикл Java, данные операторы обязательно должны в нем присутствовать. Рассмотрим простой пример использования break:

Хотя в данном операторе for предусмотрено 11 итераций, выполнится только 8, поскольку, когда счетчик i будет равен 7, сработает условие, в теле которого имеется оператор break.

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

Использование break в качестве goto

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

В этом варианте данный оператор используется в связке с меткой, которая позволяет организовывать выход не только из циклов, но и из любого блока кода. Метка представляет собой именованный соответствующим образом идентификатор с двоеточием после него. Метка объявляется в начале помечаемого блока кода. Чтобы прервать выполнение помеченного блока, в нужном месте необходимо объявить: break имя_метки. Рассмотрим пример на рисунке ниже:

В коде объявлено три блока с именами меток One, Two и Three соответственно. Оператор break с меткой Two вложен во все три блока, но при его срабатывании программа выйдет из блоков Three и Two и продолжит выполнение в блоке One. Т.е. в консоли мы увидим два сообщения: Three и One.

Заключение

Мы ознакомились с понятием циклов в Java, главными операторами while и for, а также их формами do-while и for each соответственно. Для лучшего понимания рекомендуем проделать упражнения с применением данных операторов в различных формах, а также различных способов их прерывания и перехода из одного блока в другой.

Цикл Java While Do – это инструкция, позволяющая запускать один и тот же фрагмент кода несколько раз. Этот цикл можно использовать для повторения действий при соответствии условий.

Цикл While

Цикл while является самым простым для построения на языке Java . Он состоит из ключа while , условия loop , а также тела цикла:

while (condition) { // loop body }

Каждый отдельный запуск тела цикла расценивается как итерация. Перед каждой итерацией производится оценка условий цикла. Его тело исполняется, только если условия цикла по результатам оценки равно true .

Итерации цикла что-то меняют, и в определенный момент оценка условий возвращает false , после чего цикл завершается. Цикл, условие которого никогда не возвращает false , исполняется бесконечное количество раз. Такие циклы называются бесконечными.

Пример

int num = 0; while (num < 10) { System.out.println(num); num++; }

Этот пример выводит числа от 0 до 9 . Давайте пошагово пройдёмся по коду. Сначала мы инициализируем переменную num со значением равным 0 . Это будет счётчик цикла. Когда программа доходит до while , производится оценка выполнения условий цикла. В нашем случае 0 < 10 возвращает значение true и исполняется тело цикла. Внутри цикла выводится переменная num , а затем увеличивается на 1 . На этом завершается первая итерация.

После первого «прогона » условие цикла While Java оценивается во второй раз. 1 < 10 по-прежнему возвращает true , после чего запускается следующая итерация цикла. Один и тот же процесс повторяется несколько раз.

Завершающая итерация начинается, когда значение num равняется 9 . Счётчик цикла выводится в последний раз, и значение увеличивается до 10 . На этот раз новая итерация не может быть запущена, так как условие цикла выдаёт значение false . Так как 10 не меньше 10 .

Таким образом, цикл запускается до тех пор, пока условием цикла выполняется. Вооружившись этим знанием, можно создавать более сложные и функциональные циклы. Давайте проведёт итерацию с массивом:

String names = {"Doc", "Dopey", "Bashful", "Grumpy", "Sneezy", "Sleepy", "Happy"}; int index = 0; while (index < names.length) { System.out.println(names); index++; }

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

Цикл do-while

Цикл Java while do похож на while , но имеет существенное отличие: в отличие от while , здесь условие проверяется по окончании каждой итерации. Это значит, что цикл do-while всегда исполняется хотя бы один раз:

do { // loop body } while (condition);

Пример

do-while сначала исполняет тело цикла, а затем оценивает его условия. В зависимости от полученного результата цикл останавливается или запускается следующая итерация. Давайте рассмотрим простую игру «угадай имя »:

Scanner scanner = new Scanner(System.in); String guess; do { System.out.print("Угадай имя: "); guess = scanner.nextLine(); } while (!"Daffy Duck".equals(guess)); System.out.println("Поздравляю! Ты угадал моё имя!");

В этом while Java примере используется Scanner для парсинга ввода из system.ini . Это стандартный канал ввода, который в большинстве случаев взаимодействует с клавиатурой. Проще говоря, мы просто читаем текст, который вводит игрок.

В игре необходимо спросить пользователя хотя бы раз, и делать это до тех пор, пока игрок вводит правильные ответы. Цикл do-while идеально подходит для таких случаев. В теле цикла мы получаем пользовательское значение, а затем проводится проверка правильности ответа. Цикл должен запускаться до тех пор, пока вводимое пользователем значение не становится равным Daffy Duck . Если правильный ответ получен, цикл останавливается, и мы поздравляем игрока с победой.

В завершение

Циклы while true Java позволяют использовать фрагменты кода несколько раз. Сегодня мы познакомились с циклами Java while и do-while . Они похожи тем, что проверяют условия и исполняют тело цикла, если по результатам оценки условия получено значение true . Но при этом у них есть существенное отличие: условие цикла while проверяется до итерации, а условие цикла do-while – по окончании каждой итерации. Это значит, что цикл do-while всегда исполняется как минимум один раз.

Перевод статьи “Java’s While and Do-While Loops in Five Minutes ” был подготовлен дружной командой проекта .

Цикл for

Начиная с версии JDK 5, в Java существуют две формы цикла for. Первая - традиционная форма, используемая начиная с исходной версии Java. Вторая - новая форма "for-each". Мы рассмотрим оба типа цикла for, начиная с традиционной формы.

Общая форма традиционного оператора for выглядит следующим образом:

for(инициализация; условие; повторение)
{ // тело
}

Если в цикле будет повторяться только один оператор, фигурные скобки можно опустить.

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

Ниже приведена версия программы подсчета "тактов", в которой использован цикл for.

// Демонстрация использования цикла for.
class ForTick {

int n;
for(n=10; n>0; n-)

}
}

Объявление управляющих переменных цикла внутри цикла for

Часто переменная, которая управляет циклом for, требуется только для него и не используется нигде больше. В этом случае переменную можно объявить внутри инициали-зационной части оператора for. Например, предыдущую программу можно переписать, объявляя управляющую переменную л типа int внутри цикла for:

// Объявление управляющей переменной цикла внутри цикла for.
class ForTick (public static void main(String args) {
//в данном случае переменная n объявляется внутри цикла for
for(int n=10; n>0; n-)
System.out.println("такт " + n) ;
}
}

При объявлении переменной внутри цикла for необходимо помнить о следующем важном обстоятельстве: область и время существования этой переменной полностью совпадают с областью и временем существования оператора for. (То есть область существования переменной ограничена циклом for.) Вне цикла for переменная прекратит свое существование. Если управляющую переменную цикла нужно использовать в других частях программы, ее нельзя объявлять внутри цикла for.

В тех случаях, когда управляющая переменная цикла не требуется нигде больше, большинство программистов Java предпочитают объявлять ее внутри оператора for. В качестве примера приведем простую программу, которая проверяет, является ли введенное число простым. Обратите внимание, что управляющая переменная цикла i объявлена внутри цикла for, поскольку она нигде больше не требуется.

Разновидности цикла for

Цикл for поддерживает несколько разновидностей, которые увеличивают его возможности и повышают применимость. Гибкость этого цикла обусловлена тем, что его три части: инициализацию, проверку условий и итерационную не обязательно использовать только по прямому назначению. Фактически каждый из разделов оператора for можно применять в любых целях. Рассмотрим несколько примеров.

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

boolean done = false;
for(int i=1; !done; i++) {
// ...
if(interrupted()) done = true;
}

В этом примере выполнение цикла for продолжается до тех пор, пока значение переменной done не будет установлено равным true. В этом цикле проверка значения управляющей переменной цикла i не выполняется.

Приведем еще одну разновидность цикла for. Оставляя все три части оператора пустыми, можно умышленно создать бесконечный цикл (цикл, который никогда не завершается). Например:

for(; ;) {
// ...
}

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

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

Начиная с версии JDK 5 в Java можно использовать вторую форму цикла for, реализующую цикл в стиле "for-each" ("для каждого"). Как вам, возможно, известно, в современной теории языков программирования все большее применение находит концепция циклов "for-each", которые быстро становится стандартными функциональными возможностями во многих языках. Цикл в стиле "for-each" предназначен для строго последовательного выполнения повторяющихся действий по отношению к коллекции объектов, такой как массив. В отличие некоторых языков, подобных С#, в котором для реализации циклов "for-each" используют ключевое слово f oreach, в Java возможность применения цикла "for-each" реализована за счет усовершенствования цикла for. Преимущество этого подхода состоит в том, что для его реализации не требуется дополнительное ключевое слово, и никакой ранее существовавший код не разрушается. Цикл for в стиле "for-each" называют также усовершенствованным циклом for. Общая форма версии "for-each" цикла for имеет следующий вид:

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

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

Поскольку итерационная переменная получает значения из коллекции, тип должен совпадать (или быть совместимым) с типом элементов, хранящихся в коллекции. Таким образом, при выполнении цикла по массивам тип должен быть совместим с базовым типом массива.

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

int nums = { 1, 2, 3, 4, 5, б, 7, 8, 9, 10 };
int sum = 0;
for(int x: nums) sum += x;

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

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

// Использование цикла for в стиле for-each.
class ForEach {
public static void main(String args) {

int sum = 0;
// использование стиля for-each для отображения и суммирования значений
for(int х: nums) {

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 х: nums) {
System.out.println("Значение равно: " + x) ;
sum += x; v 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 };
for(int х: nums) {
System.out.print (х + " ");
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

Итерация в многомерных массивах

Усовершенствованная версия цикла 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 ;
// присвоение значений элементам массива nums
for (int i = 0; i nums[i] [j] = (i+l)*(j+l) ; // использование цикла for в стиле for-each для отображения
// и суммирования значений
for (int х : nums) {
for(int у: х) {
System.out.println("Значение равно: " + у);
sum += у;
}
}
System.out.println("Сумма: " + sum);
}

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

Значение равно: 1
Значение равно: 2
Значение равно: 3
Значение равно: 4
Значение равно: 5
Значение равно: 2
Значение равно: 4
Значение равно: 6
Значение равно: 8
Значение равно: 10
Значение равно: 3
Значение равно: 6
Значение равно: 9
Значение равно: 12
Значение равно: 15
Сумма: 9 0

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

for (int х : nums) {

Обратите внимание на способ объявления переменной х. Эта переменная - ссылка на одномерный массив целочисленных значений. Это необходимо потому, что результат выполнения каждой итерации цикла for - следующий массив в массиве nums, начиная с массива, указанного элементом nums . Затем внутренний цикл 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
for (int x: nums) {
if (x == val) {
found = true;
break;
}
}
if(found)
System.out.println("Значение найдено!");}

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



Последнее обновление: 31.10.2018

Еще одним видом управляющих конструкций являются циклы. Циклы позволяют в зависимости от определенных условий выполнять определенное действие множество раз. В языке Java есть следующие виды циклов:

Цикл for

Цикл for имеет следующее формальное определение:

For ([инициализация счетчика]; [условие]; [изменение счетчика]) { // действия }

Рассмотрим стандартный цикл for:

For (int i = 1; i < 9; i++){ System.out.printf("Квадрат числа %d равен %d \n", i, i * i); }

Первая часть объявления цикла - int i = 1 создает и инициализирует счетчик i. Счетчик необязательно должен представлять тип int . Это может быть и любой другой числовой тип, например, float. Перед выполнением цикла значение счетчика будет равно 1. В данном случае это то же самое, что и объявление переменной.

Вторая часть - условие, при котором будет выполняться цикл. В данном случае цикл будет выполняться, пока i не достигнет 9.

И третья часть - приращение счетчика на единицу. Опять же нам необязательно увеличивать на единицу. Можно уменьшать: i-- .

В итоге блок цикла сработает 8 раз, пока значение i не станет равным 9. И каждый раз это значение будет увеличиваться на 1.

Нам необязательно указывать все условия при объявлении цикла. Например, мы можем написать так:

Int i = 1; for (; ;){ System.out.printf("Квадрат числа %d равен %d \n", i, i * i); }

Определение цикла осталось тем же, только теперь блоки в определении у нас пустые: for (; ;) . Теперь нет инициализированной переменной-счетчика, нет условия, поэтому цикл будет работать вечно - бесконечный цикл.

Либо можно опустить ряд блоков:

Int i = 1; for (; i<9;){ System.out.printf("Квадрат числа %d равен %d \n", i, i * i); i++; }

Этот пример эквивалентен первому примеру: у нас также есть счетчик, только создан он вне цикла. У нас есть условие выполнения цикла. И есть приращение счетчика уже в самом блоке for.

Цикл for может определять сразу несколько переменных и управлять ими:

Int n = 10; for(int i=0, j = n - 1; i < j; i++, j--){ System.out.println(i * j); }

Цикл do

Цикл do сначала выполняет код цикла, а потом проверяет условие в инструкции while. И пока это условие истинно, цикл повторяется. Например:

Int j = 7; do{ System.out.println(j); j--; } while (j > 0);

В данном случае код цикла сработает 7 раз, пока j не окажется равным нулю. Важно отметить, что цикл do гарантирует хотя бы однократное выполнение действий, даже если условие в инструкции while не будет истинно. Так, мы можем написать:

Int j = -1; do{ System.out.println(j); j--; } while (j > 0);

Хотя переменная j изначально меньше 0, цикл все равно один раз выполнится.

Цикл while

Цикл while сразу проверяет истинность некоторого условия, и если условие истинно, то код цикла выполняется:

Int j = 6; while (j > 0){ System.out.println(j); j--; }

Операторы continue и break

Оператор break позволяет выйти из цикла в любой его момент, даже если цикл не закончил свою работу:

Например:

< nums.length; i++){ if (nums[i] > 10) break; System.out.println(nums[i]); }

Так как в цикле идет проверка, больше ли элемент массива 10, то мы не увидим на консоли последние два элемента, так как когда nums[i] окажется больше 10 (то есть равно 12), сработает оператор break, и цикл завершится.

Правда, мы также не увидим и последнего элемента, который меньше 10. Теперь сделаем так, чтобы если число больше 10, цикл не завершался, а просто переходил к следующему элементу. Для этого используем оператор continue :

Int nums = new int { 1, 2, 3, 4, 12, 9 }; for (int i = 0; i < nums.length; i++){ if (nums[i] > 10) continue; System.out.println(nums[i]); }

В этом случае, когда выполнение цикла дойдет до числа 12, которое не удовлетворяет условию проверки, то программа просто пропустит это число и перейдет к следующему элементу массива.

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то