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;
}
'programing' 카테고리의 다른 글
Windows 7, update.packages 문제 : "임시 설치를 이동할 수 없습니다"? (0) | 2020.10.20 |
---|---|
배열의 인덱스가 존재합니까 (0) | 2020.10.20 |
생성자가 null 객체를 반환 할 수 있습니까? (0) | 2020.10.20 |
마지막 결과뿐만 아니라 Jupyter에서 전체 출력을 표시하는 방법은 무엇입니까? (0) | 2020.10.19 |
"./docker-compose.yml"의 버전은 지원되지 않습니다. (0) | 2020.10.19 |