Можно использовать разрыв для внешнего цикла?
Если я использую break
как приведенный ниже код, тогда цикл внутри row
не будет повторять остальные, если в начале есть совпадение, но как насчет цикла col
?
Будет ли он повторяться между 0 и 7? Есть ли способ использовать break
там тоже?
for (int col = 0; col < 8; col ++)
for (int row = 0; row < 8; row ++)
if (check something)
{
//Then do this;
break;
}
Ответы
Ответ 1
Один из вариантов - использовать флаг условия. Затем вы можете либо нарушить внешний цикл, либо просто использовать его как дополнительное условие в циклах for
:
bool keepGoing = true;
for (int col = 0; col < 8 && keepGoing; col++)
{
for (int row = 0; row < 8 && keepGoing; row++)
{
if (something)
{
// Do whatever
keepGoing = false;
}
}
}
В Java вы можете указать ярлык, который нужно сломать. (Я не видел, чтобы этот вопрос был помечен как Java, так и С#.)
outerLoop:
for (...)
{
for (...)
{
if (...)
{
break outerLoop;
}
}
}
EDIT: Как отмечено в комментариях, на С# вы можете использовать метку и goto
:
for (...)
{
for (...)
{
if (...)
{
goto endOfLoop;
}
}
}
endOfLoop:
// Other code
Я бы действительно рекомендовал, чтобы вы не использовали ни один из этих подходов.
В обоих языках обычно лучше всего просто превратить обе петли в один метод - тогда вы можете просто вернуться из метода:
public void doSomethingToFirstOccurrence()
{
for (...)
{
for (...)
{
if (...)
{
return;
}
}
}
}
Ответ 2
Да, это возможно, используя метку break
:
package others;
public class A {
public static void main(String[] args) {
outer: for(int col = 0; col < 8; col ++)
{
for (int row = 0; row < 8; row ++)
{
if (col == 4)
{
System.out.println("hi");
break outer;
}
}
}
}
}
Ответ 3
Вы можете поставить логику следующим образом:
boolean condition = false;
for (int col = 0; col < 8; col ++)
for (int row = 0; row < 8; row ++)
if (check something) {
// Then do this:
condition = true; // Break condition for outer loop
break;
}
}
if (condition)
break;
}
Ответ 4
Он не выходит из цикла col.
Вместо этого вы можете обернуть все в функцию и использовать return;
для немедленного выхода из цикла
private Xy Loop( /* Parameters */)
for (int col = 0; col < 8; col ++)
for (int row = 0; row < 8; row ++)
if (check something) {
// Then do this;
return something; //Or just return;
}
}
}
}
Ответ 5
break
только разбивает цикл, который находится непосредственно вокруг него. Вы можете использовать флаг для управления внешним циклом:
boolean continueOuterLoop = true;
for(int col = 0; continueOuterLoop && col < 8; col ++) {
for(int row = 0; row < 8; row ++) {
if(check something) {
//Then do this;
continueOuterLoop = false;
break;
}
}
}
Ответ 6
nameHere:
for (yourForLoop) {
for (anotherLoop) {
if(condition) {
break nameHere;
}
}
}
Ответ 7
Я думаю, вы должны использовать тег или ярлык, например, "outerLoop". Это работает на Java:
outerLoop:
for (int col = 0; col < 8; col ++)
for (int row = 0; row < 8; row ++)
if (check something)
{
//Then do this;
break outerLoop;
}
Ответ 8
Еще одна альтернатива другим ответам - установить максимальные счетчики, чтобы остановить циклы.
for (int col = 0; col < 8; col ++)
for (int row = 0; row < 8; row ++)
if (check something)
{
// Use the col and row here.
// Now we go for a totally break of all loops.
// To stop the loops you can set that to the maximum
// of your loop test.
row = 8;
col = 8;
}
Преимущество этого трюка заключается в том, что вы не добавляете дополнительный код проверки в полный цикл, и это делает его намного быстрее.
Ответ 9
В Java вы можете использовать break label
outer:
for (int col = 0; col < 8; col ++)
for (int row = 0; row < 8; row ++)
if (check something)
{
break outer;
}
}
}
И, поскольку никто еще не упомянул об этом, в С# вы можете использовать goto label
for (int col = 0; col < 8; col ++)
for (int row = 0; row < 8; row ++)
if (check something)
{
goto outside;
}
}
}
outside:
Ответ 10
Есть несколько способов сделать это. Один из способов - установить максимальное значение переменной во внешнем цикле.
int maxcol = 8;
for (int col = 0; col < maxcol; col++)
{
for (int row = 0; row < 8; row++)
{
if (check something)
{
Then do this;
// cause the outer loop to break:
col = maxcol;
// break the inner loop
break;
}
}
}
Ответ 11
Установите col = 8, а затем перейдите во внутренний цикл.
Ответ 12
Loop1:
for (int col = 0; col < 8; col ++)
{
for (int row = 0; row < 8; row ++)
{
if (condition)
{
break Loop1;
}
}
}
Это может сделать то, что вам нужно...
Ответ 13
Мы могли бы использовать концепцию переменной флага:
flag = 1;
for (int col = 0; col < 8; col ++)
{
if (flag == 1)
{
for (int row = 0; row < 8; row ++)
{
if (flag == 1)
{
if (check something)
{
//Then do this;
flag = 0;
}
}
}
}
}