Java — Java цикл, не могу вывести значения из цикла


Как вырваться из вложенных циклов в Java?

У меня есть конструкция вложенного цикла, как это:

Теперь, как я могу вырваться из обеих петель? Я смотрел на подобные вопросы, но ни один из них не касается конкретно Java. Я не мог применить эти решения, потому что большинство использовали gotos.

Я не хочу помещать внутренний цикл в другой метод.

Я не хочу повторять циклы. При разрыве я заканчиваю выполнение цикла цикла.

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

Вы можете использовать break с меткой для внешнего цикла. Например:

Технически правильный ответ — обозначить внешний цикл. На практике, если вы хотите выйти из любой точки внутри внутреннего цикла, вам лучше будет вытеснить код в метод (статический метод, если это необходимо), а затем вызвать его.

Это оправдало бы читаемость.

Код будет выглядеть примерно так:

Соответствие примера для принятого ответа:

Вы можете использовать именованный блок вокруг циклов:

Я никогда не использую метки. Похоже, плохая практика. Вот что я буду делать:

Вы можете использовать метки:

Вы можете использовать временную переменную:

В зависимости от вашей функции вы также можете выйти/вернуться из внутреннего цикла:

Если вам не нравятся break и goto s, вы можете использовать «традиционный» для цикла вместо «in-in» с дополнительным условием прерывания:

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

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

Вы можете отключиться от всех циклов без использования метки: и flags.

Это просто сложное решение.

Здесь условие 1 — это условие, которое используется для разрыва с петлями K и J. И условие2 — это условие, которое используется для разрыва с циклами K, J и I.

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

  • примерно в два раза больше строк
  • больше потребления вычислительных циклов, что означает, что он медленнее с алгоритмической точки зрения
  • больше печатать работу
  • более высокое отношение к разделению интересов из-за функциональной детализации
  • более высокий коэффициент повторного использования и управления поиском/манипулированием логикой без
  • методы не длинные, поэтому они более компактны и их легче понять
  • более высокий коэффициент читаемости

Так что это просто обработка дела с помощью другого подхода.

В основном вопрос к автору этого вопроса: что вы думаете об этом подходе?

Циклы в Java: for, while, do-while

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

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

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

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

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

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

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

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

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

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


Бесконечный for (Java) цикл

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

Цикл while Java: описание и примеры

While является основополагающим оператором цикла в Java. Заключенный в его теле фрагмент кода будет повторяться до тех пор, пока условие выражения, заключенного в скобки после него, будет удовлетворять истинному значению. Оператор while в общем виде имеет следующий вид: while (условие). Как только значение логического условия перестанет быть истинным, код, заключенный в тело цикла, перестанет выполняться. Управление передастся строке, которая идет сразу после него. Если в теле цикла заключен всего один оператор, то можно не ставить фигурные скобки. Однако, среди программистов считается хорошим тоном всегда ставить их. Давайте разберем пример:

Цукерберг рекомендует:  Быстрые адаптивные макеты с помощью Jeet

Цикл While

Вкратце

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

Напишем функцию с циклом, который будет выводить на экран числа от 1 до числа-аргумента:

Конструкция while читается так: «делать то, что указано в теле цикла пока истинно условие (предикат) i ». При этом истинность условия проверяется перед каждым выполнением тела цикла, в том числе перед первым.

Цикл while состоит из трех элементов:

  • Ключевое слово while .
  • Предикат в скобках после while .
  • Блок кода в фигурных скобках (тело цикла).

Каждое выполнение тела называется итерацией. В нашем примере вызов printNumbers(3) породил три итерации, на каждой из которых была выведена на экран переменная i .

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

Часто обеспечение конечности цикла сводится к введению переменной, называемой «счётчик», во-первых потому, что так легко передать идею “повторить N раз”, а во-вторых, в самом теле цикла может использоваться значение счетчика — как в нашем примере использовалось i для print. Сначала счетчик инициализируется, то есть ему задаётся начальное значение. В нашем примере это делает инструкция i = 1 . Затем в условии цикла проверяется, не достиг ли счетчик своего предельного значения.

В нашем примере предельное значение определяется аргументом функции. Если условие цикла не выполнено, то тело не выполняется и интерпретатор двигается дальше, выполняя инструкции после цикла. Но если условие цикла истинно, то выполняется тело, в котором находится ключевой элемент остановки — изменение счетчика. Обычно его делают в конце тела. В нашем примере за изменение отвечает строчка i = i + 1 .

Задание

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

Как вернуть значение из цикла for?

Я пытаюсь получить результат:

Но когда я запускаю код, я получаю следующее:

Мой вопрос в том, как вернуть результат каждой итерации цикла for через factorial статический метод к main методу?

Вам нужно удалить return f; который находится в цикле for . Возврат внутри if всегда будет возвращаться к вызывающему методу сразу после первой итерации. И именно поэтому вы получаете 1 в качестве результата для всех факториалов.

Не возвращайся сюда:

а скорее в конце вашего цикла. Вам нужно аккумулировать окончательный результат по всем итерациям цикла.

Три проблемы с кодом:

factorial(i) вызова factorial(i) не factorial(n)

Верните один раз; после окончания цикла

Хм. вы вроде бы думаете о операции yield (которая доступна на некоторых языках, но не в Java). yield — это конструкция, которая гласит: «вернуть значение из функции, но пометить место, где я сейчас нахожусь, и позволить мне вернуться к нему позже». return с другой стороны, говорит что — то вроде «вернуть значение и отбросить все, что я делаю». В Java вы не можете «поставить петлю на удержание» и вернуться к ней позже.

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

public static vo >

Обратите внимание, что вышеизложенное может быть написано лучше — я попытался как можно меньше изменить ваш код.

Java/Операторы цикла for, while, do . while

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

Оператор while [ править ]

Конструкция оператора while :

Где выражение в скобках определяет условие: пока ( while ) оно выполняется, будет выполняться выражение в фигурных скобках.

Данный цикл выведет:

Стоит обратить внимание, что число 10 выведено не будет, так как while это оператор предусловия.

Также обратите внимание на метод print использованный в этом коде, в отличие от println метод print не переводит курсор на новую строку.


Оператор do. while [ править ]

Конструкция оператора do while :

Отличие данного оператора от while только в том, что он является оператором постусловия (сначала выполнит, потом проверит).
То есть, даже если условие не выполняется никогда, всё равно действие будет выполнено один раз.

Данный цикл выведет:

Как видно из кода, несмотря на то что 2 == 3 строчка всё равно была выведена на экран.

Оператор for [ править ]

Конструкция оператора for :

Цикл for использует переменную i и проверяя её значение выполняет операторы, после чего совершает над ней действие. Например:

Цикл работает с переменной i . После инициализации этой переменной проверяется условие логического выражения ( i ), если оно равно true , действие в теле цикла выполняется, после чего переменная увеличивается операцией инкремента i++ . И так повторяется до тех пор пока условие логического выражения равняется true .

Бесконечные циклы в Java

посмотрите на следующую бесконечность while цикл в Java. Это вызывает ошибку времени компиляции для инструкции ниже.

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

во втором случае также оператор после цикла, очевидно, недоступен, потому что булева переменная b правда до сих пор компилятор вообще не жалуется. Почему?

Edit: следующая версия while застревает в бесконечном цикле, как очевидно, но не выдает ошибок компилятора для оператора ниже него, хотя if условие в цикле всегда false и, следовательно, цикл никогда не может вернуться и может быть определен компилятором во время компиляции себя.

Edit: то же самое и с if и while .

следующая версия while также застревает в бесконечном цикле.

это так finally блок всегда выполняется, даже если return заявление встречается перед ним в блок.

15 ответов

компилятор может легко и однозначно доказать, что первое выражение всегда приводит к бесконечному циклу, но это не так просто для второго. В вашем игрушечном примере это просто, но что, если:

  • содержимое переменной считывалось из файла?
  • переменная не была локальной и могла быть изменена другим потоком?
  • переменная полагалась на некоторый пользовательский ввод?
Цукерберг рекомендует:  Sql server - LIKE and UPPER SQLPGSQL

компилятор явно не проверка ваш более простой случай, потому что он полностью отказывается от этой дороги. Почему? Потому что это гораздо сложнее Запрещенные спец. См.14.21:

(кстати, мой компилятор тут пожаловаться, когда переменная объявлена final .)

по технические характеристики, следующее сказано о заявлениях while.

оператор while может выполнить нормально iff по крайней мере один из верно следующее:

  • while оператор достижим, и выражение условия не является константным выражением со значением true.
  • существует достижимый оператор break, который выходит из оператора while.\

Так, компилятор будет только говорить, что код, следующий за оператором while, недоступен, если условие while является константой с истинным значением или есть оператор break в while. Во втором случае, поскольку значение b не является константой, он не считает код, следующий за ним, недостижимым. За этой ссылкой есть намного больше информации, чтобы дать вам более подробную информацию о том, что такое и что не считается недостижимым.

потому что true является постоянным, и b может быть изменен в цикле.

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

существует много способов обмануть компилятор-еще один распространенный пример —

не будет работать, поскольку компилятор будет понимать, что этот район был unreacable. Вместо этого, вы могли бы do

это будет работать, так как компилятор не может понять, что выражение никогда не будет ложным.

последнее не является недостижимым. Логическое b все еще имеет возможность быть измененным на false где-то внутри цикла, вызывая условие окончания.

Я предполагаю, что переменная » b » имеет возможность изменить свое значение, поэтому компилятор думает System.out.println(«while terminated»); можно связаться.

компиляторы не идеальны-и не должны быть

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

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

сильная типизация и OO : повышение эффективности компилятора


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

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

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

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

Я удивлен, что ваш компилятор отказался компилировать первом случае. Мне это кажется странным.

но второй случай не оптимизирован для первого случая, потому что (a) другой поток может обновить значение b (b) вызываемая функция может изменить значение b как побочный эффект.

на самом деле я не думаю, что кто-то понял это правильно (по крайней мере, не в первоначальном смысле вопроса). OQ продолжает упоминать:

правильно, но не имеет значения, так как b не изменяется в цикле

но это не имеет значения, потому что последняя строка достижима. Если вы взяли этот код, скомпилировали его в файл класса и передали файл класса кому-то другому (скажем, как библиотеку), они могут связать скомпилированный класс с кодом, который изменяет «b» через отражение, выход из цикла и выполнение последней строки.

Это верно для любой переменной, которая не является константой (или final, которая компилируется с константой в том месте, где она используется-иногда вызывая причудливые ошибки, если вы перекомпилируете класс с final, а не класс, который ссылается на него, ссылочный класс по-прежнему будет содержать старое значение без каких-либо ошибок)

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

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

это просто потому, что компилятор не слишком много работает с ребенком, хотя это возможно.

показанный пример прост и разумен для компилятора для обнаружения бесконечного цикла. Но как насчет вставки 1000 строк кода без каких-либо отношений с переменной b ? А как насчет тех утверждений, которые все b = true; ? Компилятор определенно может оценить результат и сказать вам, что это правда в конце концов в while цикл, но как медленно он будет компилировать реальный проект?

PS, lint tool определенно должен сделать это за вас.

С точки зрения компилятора это b на while(b) может измениться на false где-нибудь. Компилятор просто не утруждает себя проверкой.

для начала попробовать while(1 , for(int i = 0; i etc.

выражения оцениваются во время выполнения, поэтому при замене скалярного значения «true» на что-то вроде булевой переменной вы изменили скалярное значение на булевое выражение, и, таким образом, компилятор не может узнать его во время компиляции.

если компилятор может окончательно определить, что логическое значение будет равно true во время выполнения он выдаст эту ошибку. Компилятор предполагает, что переменная, которую вы объявили can изменить (хотя мы знаем, что здесь, как и люди ее не будет).

чтобы подчеркнуть этот факт, если переменные объявлены как final в Java большинство компиляторов выдадут ту же ошибку, что и при замене значения. Это связано с тем, что переменная определяется во время компиляции (и не может быть изменены во время выполнения) и поэтому компилятор может окончательно определить, что выражение true во время выполнения.

Цукерберг рекомендует:  Мир заставляет меняться. Кто не готов, остается за бортом

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

Циклы в Java

  • написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
  • это одна из статей из нашего «Самоучителя по Java»

Для начала давайте разберёмся что же такое цикл. Цикл – это какое-то повторяющееся действие.

Например, каждое утро Вы:

  1. Встаёте с кровати
  2. Идёте в душ, чистите зубы, и дальше кому как повезло: кто ноги бреет, кто лицо
  3. Открываете холодильник и поглощаете все, что под руку попало
  4. Одеваетесь
  5. Идёте на работу или учебу

И так, минимум 5 раз в неделю (понедельник-пятница) Вы делаете одну и ту же последовательность действий. А раз делается одна и та же последовательность действий, значит речь идёт о цикле. Ну, вот, теперь Вы знаете, что такое цикл.

В Java выделяют 4 вида циклов:

  1. Цикл while
  2. Цикл do…while
  3. Цикл for
  4. Цикл for each

На данном этапе Вам достаточно знать только первые 3 вида циклов.

Цикл for each мы разберём позже вот в этой статье. Сейчас лишь скажем Вам, что цикл for each — это разновидность цикла for. Впервые цикл for each появился в JDK5. В более ранних версиях JDK этого вида цикла не было.

Итак, самое время познакомиться с циклом while.

Цикл while

Цикл while еще называют цикл «пока» или «до тех пор пока».

Давайте начнем с выдуманного немного шуточного житейского примера.

Допустим, у Вас есть друг Вася, а у Васи есть девушка Аленушка. У них «конфетно-букетный период» – сами знаете что это такое. И вот Вася дарит ей цветы, водит по кафешкам, покупает мороженое. Одним словом – обхаживает.

Но бюджет то у Васи не резиновый. И вот Вася говорит себе: «Буду Аленушку водить по кафешкам и цветы дарить до тех пор пока в кошельке у меня будет не меньше 200 грн. Но как только увижу, что в кошельке хоть на 1 копейку меньше, чем 200 грн, — всё, закрываем «конфетно-букетный период», просто сидим дома на диванчике, смотрим телик и всё такое.


Если описать эту житейскую ситуацию в конструкции цикла while (напоминаем, цикл whilе еще иногда называют цикл «до тех пор пока»), то это будет выглядеть так:

Как вернуть значение из цикла for?

Я пытаюсь получить результат:

Но когда я запускаю код, я получаю следующее:

Мой вопрос в том, как вернуть результат каждой итерации цикла for через factorial статический метод к main методу?

Вам нужно удалить return f; который находится в цикле for . Возврат внутри if всегда будет возвращаться к вызывающему методу сразу после первой итерации. И именно поэтому вы получаете 1 в качестве результата для всех факториалов.

Не возвращайся сюда:

а скорее в конце вашего цикла. Вам нужно аккумулировать окончательный результат по всем итерациям цикла.

Три проблемы с кодом:

factorial(i) вызова factorial(i) не factorial(n)

Верните один раз; после окончания цикла

Хм. вы вроде бы думаете о операции yield (которая доступна на некоторых языках, но не в Java). yield — это конструкция, которая гласит: «вернуть значение из функции, но пометить место, где я сейчас нахожусь, и позволить мне вернуться к нему позже». return с другой стороны, говорит что — то вроде «вернуть значение и отбросить все, что я делаю». В Java вы не можете «поставить петлю на удержание» и вернуться к ней позже.

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

public static vo >

Обратите внимание, что вышеизложенное может быть написано лучше — я попытался как можно меньше изменить ваш код.

Java — Java цикл, не могу вывести значения из цикла

74 просмотра

5 ответа

5 Репутация автора

Привет, ребята, я не знаю, существует ли он в Java, но я хочу вывести t1 t2 t3 с помощью цикла, например, для i = 1 t (i = 1) => t1, так что это даст нам 5, как я могу это сделать и спасибо всем.

Ответы (5)

3 плюса

27587 Репутация автора

3 переменные означают, что требуются три атомарных оператора, но чтобы получить к ним непрерывный доступ, соберите их в некоторый контейнер, такой как массив, поэтому используйте

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

и называть это как

1 плюс

11764 Репутация автора

Там нет никакого способа вызвать variable использование String или int или что-то

Но это цель arrays , первый индекс 0 и последний length-1 (here 2)

Автор: azro Размещён: 14.05.2020 05:38

плюса

1 Репутация автора

Цикл for будет печатать только значения t1, t2, t3 только потому, что вы инициализировали t1 как переменную, а в своих выходных данных вы используете ее как текст, включая кавычки. Попробуйте этот код.

-1 плюса

16 Репутация автора

Пожалуйста, скажите мне, если я не понимаю ваш вопрос. Кажется, вы пытаетесь напечатать t1, t2 и t3, но на основе i из цикла for справа? Итак, вы думаете, что t + i должно быть сначала t1, затем t2, затем t3 и, наконец, вывести эти значения. Это не работает для любого языка таким образом. Прежде всего, t — это символ, а 1, 2 или 3 — целое число. Во-вторых, если вы поместите это в System.out.println таким образом, это в основном означает «распечатать t и затем i», а не «распечатать, каким будет t + i (как инициализировано)». Я мог бы не очень ясно объяснить. В любом случае, вы должны использовать массив.

плюса

1701 Репутация автора

Можно «t» + i считать ключом (вместо имени динамической переменной, которое не поддерживается)? Если это соответствует контексту, тогда можно использовать карту. Например:

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих