programing

Objective-C에서 두 개의 중첩 된 for 루프를 어떻게 나눌 수 있습니까?

nasanasas 2020. 10. 20. 07:41
반응형

Objective-C에서 두 개의 중첩 된 for 루프를 어떻게 나눌 수 있습니까?


다음과 같이 중첩 된 두 개의 for 루프가 있습니다.

for(...) {
    for(...) {

    }
}

나는 break진술 이 있다는 것을 압니다 . 그러나 나는 그것이 두 루프를 모두 깨뜨 리거나 호출 된 루프를 깨뜨리는 것인지 혼란 스럽습니까? 여러 번 반복하는 것이 타당하지 않다는 것을 알게 되 자마자 두 가지를 모두 깰 필요가 있습니다.


break는 하나의 루프에서 벗어나지 만 내부가 끊어 질 때 끊어지는 외부 루프에 체크를 추가 할 수 있습니다.

bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
   for ( ... ) {
      if (...) {
         dobreak = true;
         break;
      }
   }
}

goto를 사용하여 코드를 단순화하면 적절할 것입니다.

for (;;) 
{
    for (;;) 
    {
        break; /* breaks inner loop */
    } 
    for (;;) 
    {
        goto outer; /* breaks outer loop */
    }
} 
outer:;

break명령문은 가장 안쪽의 루프에서만 빠져 나옵니다. 전용 상태 변수의 코드, 메모리 및 성능에 추가 된 오버 헤드를 원하지 않는 경우 코드를 자체 함수 또는 메서드로 리팩토링하고 사용하여 return모든 루프에서 벗어나는 것이 좋습니다 .

void do_lots_of_work(void)
{
  int i, j;

  for(i=0; i<10 ; i++)
  {
    for(j=0;j< 10; j++)
    {
     ..
     ..
     if(disaster_struck())
      return; /* Gets us out of the loops, and the function too. */
    }
  }
}

이미 언급 한 플래그 변수 또는 goto 외에 Objective-C 예외를 throw 할 수 있습니다 .

@try {
  for() {
    for() {
       @throw ...
    }
  }
}
@catch{
  ...
}

다른 사람들은 플래그를 설정하거나를 사용하는 방법을 언급 goto했지만 내부 루프가 별도의 메서드로 바뀌도록 코드를 리팩토링하는 것이 좋습니다. 그런 다음이 메서드는 외부 루프가해야 함을 나타내는 플래그를 반환 할 수 있습니다 break. 메서드의 이름을 적절하게 지정하면 훨씬 더 읽기 쉽습니다.

for (int i = 0; i < 10; i++) {
   if (timeToStop(i)) break;
}

-(bool) timeToStop: (int) i {
    for (int j = 0; j < 10; j++) {
        if (somethingBadHappens) return true;
    }

    return false;
}

테스트되지 않은 의사 코드이지만 아이디어를 얻습니다.


break 문은 부모 루프 인 범위의 루프에서만 중단됩니다. 두 번째 루프에서 벗어나고 싶다면 두 루프의 범위에있는 부울 변수를 사용할 수 있습니다.

bool isTerminated = false;

for (...)
{
    if (!isTerminated)
    {
        for(...)
        {
            ...

            isTerminated = true;
            break;
        }
    }
    else
    {
        break;
    }
}

휴식 전에 상단 루프의 카운터 변경

for(i=0; i<10 ; i++)
  for(j=0;j< 10; j++){
     ..
     ..
     i = 10; 
     break;
  }

아마도 가장 쉬운 방법은 "flag"변수를 사용하는 것입니다

for(i=0; i<10 && (done==false); i++)
  for(j=0;j< 10; j++){
     ..
     ..
     if(...){done=true; break;}
  }

Another solution is to factor out the second loop in a function:

int i;

for(i=0; i<10 ; i++){
    if !innerLoop(i) {
        break;
    }
}

bool innerLoop(int i)
    int j;
    for(j=0;j< 10; j++){
        doSomthing(i,j);
        if(endcondtion){
            return false;
        }
    }
}

The break statement breaks out of the innermost loop. An additional test and break statement would be needed to break out of the outer loop.


If a break is executed from within a set of nested loops, only the innermost loop in which the break is executed is terminated. (Just like standard C)


Exactly like the last ones are, generally like this:

for(i=0;i<a;i++){  
 for(j=0;j<a;j++){
  if(Something_goes_wrong){
   i=a;
   break;
   }
 }
}

Just for grins, how about changing this true/false check into a method and using return statements:

- (bool) checkTrueFalse: parameters{

   for ( ...) {
      for ( ... ) {

         if (...) {
            return true;
         }

      }
   }
   return false;
}

참고URL : https://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective-c

반응형