Подтвердить что ты не робот

Можно использовать разрыв для внешнего цикла?

Если я использую 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;
        }
4b9b3361

Ответ 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;
                }
            }
        }
    }
}