2013-10-30 4 views
1

나는 자동차 좌표 목록을 반복하고 그 위에 다른 기능을 수행하는 프로그램을 가지고있다. 나는 너무 가깝지 않은 연속적인 코디네이트 쌍만 찾고있다. 차량이 오랫동안 정지 해 있다면, 수 천 개의 연속적인 좌표가 서로 겹칠 가능성이 있습니다.for 루프 반복기를 수동으로 업데이트하는 것이 바람직하지 않습니까?

일단 두 개의 좌표를 찾으면 수동으로 반복기 (i = j-1)를 업데이트하여 수천 개의 좌표를 반복해서 넘길 필요가 없습니다. 제 질문은이 좋은 습관입니까? 아니면 실용적인 대안이 있습니까? 이 온라인의 예를 찾을 수 없었습니다. 나는 '계속'진술을 보았지만 이것은 여분의 if 문을 필요로하는 것 같았고 수동 업데이트는 좀 더 '우아함'이었다.

int LatLngSize = latLngList.size(); 
for (int i = 0; i < LatLngSize; i++) { 
    j = i + 1; 
    validPoints = true; 
    if (LatLngSize > j) { 
     latLng1.setCoordinate(latLngList.get(i)); 
     latLng2.setCoordinate(latLngList.get(j)); 
     consecutivePointDistance = latLng1.distance(latLng2); 
    } 
    while (consecutivePointDistance < 0.05) { 
     j++; 
     if (LatLngSize > j) { 
      latLng2.setCoordinate(latLngList.get(j)); 
      consecutivePointDistance = latLng1.distance(latLng2); 
      i = j - 1; // This is the potential offender. 
     } else { 
      validPoints = false; 
      consecutivePointDistance = 100; 
     } 
    } 

    //Do stuff with my latlng1 and latlng2 
} 
+0

매우 좋지는 않지만 유효합니다. 일반적으로 'while'루프로 다시 작성할 수 있습니다 - 조건에 따라 바깥 루프 매개 변수를 다르게 업데이트한다는 사실이 더 분명합니다. 일반적으로'for' 루프는 매번 동일한 증가분으로 실행될 것으로 예상됩니다. 코드를 따르기가 조금 더 어려워 지므로 버그가 발생하기 쉽습니다. – Floris

+0

나는 이런 식으로 할 필요가 없다고 생각합니다. 내 대답은 http://stackoverflow.com/questions/19672975/is-manual-updating-a-for-loop-iterator-bad-practice/19673075#19673075를 참조하십시오. –

답변

3

예. 나쁜 습관입니다. 컴파일되고 실행됩니다.하지만 질문에 대한 대답은 나쁜 습관입니다.

반복기를 수동으로 업데이트하려면 while 루프를 사용하십시오.

for 루프로 수행 할 수있는 작업은 모두 while 루프로 수행 할 수 있습니다. 실제로 구현할 루프의 선택은 가독성 문제입니다. for 루프에서 사람들은 iterator가 update 문과 update 문에서만 업데이트 될 것으로 예상합니다.

당신이 당신의 반복자 만 업데이트 문에서 업데이트되도록, 루프를 다시 작성 같은 것을 고려하는 방법을 알아낼 수없는 경우 : 그냥 예를 들어

for(int i=0; i<someValue; ++i /*i also updated at line 18*/) 

합니다. 이것은 코드를 다시 작성하는 것보다 여전히 좋지 않으므로 18 행 (또는 모든 행)에서 업데이트되지 않지만 18 행에서 업데이트하고 여기에 업데이트 문에 주석을 남기지 않는 것보다 훨씬 낫습니다.

또한,이 답변에 대한 의견에 따라,이 시도 :이 경우 지금

for(int i=0; i<someValue; /*see body*/) { 
    //do stuff 
    //update i 
    //do stuff 
} 

를, 당신의 업데이트 문은 완전히 비어, 그래서 심지어 /*see body*/ 코멘트없이 코드를 유지하는 사람이 이미 i해야한다는 것을 알고있다 몸체 어딘가에서 수정 될 수있다. 그리고 업데이트 문에서 ++i 동작은 for 루프의 마지막 줄에 ++i을 추가하여 간단히 다시 만들 수 있습니다.

+0

가끔 문법을 사용합니다 :'for (int i = 0; i azz

+0

@DerFlatulator 하하, 편집 중이 었음이 틀림 없습니다. 당신이 코멘트를 남겼을 때. 나는 개인적으로 나 자신을 한 적이 없지만 나의 대답을 게시 한 후에 그 생각을했습니다. 비록 귀하의 버전에는 실제로 빈 버전의 업데이트 진술서가 있습니다. 이는 아마 가장 좋은 버전 일 것입니다. – nhgrif

+0

간단한 설명을 남기려면 사람들이 루프의 본문에서 반복 값이 수정된다는 점을 알아야합니다. 불행히도 사람들은 for 루프를보고 가정을합니다. – azz

0

예. 나쁜 습관입니다. 하지 마. 난 당신의 코드를 유지하고있어, 나는

for (int i = 0; i < latLngSize; i++) 

를 참조하면 나는 latLngSize에 도달 할 때까지이 0에서, 반복, 하나 그 i 증가를 의미하는 걸릴. i의 다른 인스턴스가 더 이상 변경되지 않습니다. 따라서 모든 향후 개발자의 분노를 걱정하지 않는 한, i을 위험 부담으로 변경하십시오.

0

원하는 것을 수행하지 않습니까?

int size = latLngList.size(); 
for (int i = 0; i + 1 < size; i++) { 
    latLng1.setCoordinate(latLngList.get(i)); 
    latLng2.setCoordinate(latLngList.get(i+1)); 
    if(latLng1.distance(latLng2) >= 0.05) { 
     //Do stuff with my latlng1 and latlng2 
    } 
} 
+0

그래, 제공된 코드를 단순화 할 수 있습니다. 1에서 iterator를 시작하는 것조차 도움이됩니다. 아직 개선중인 작업이며 아직 코드를 작성하는 데 최선이 아닙니다. – Jags

+0

Matt, "조숙 한 최적화는 모든 악의 근원입니다"라는 말을 들었을 때입니다. 실제로 작업/직선 초안을 얻는 것이 더 중요 할 때 한 가지 더 진술을 추가하는 우아함에 대해 걱정했습니다. – clwhisk