2

I have a program that loops over a list of vehicle co-ordinates and then performs other functions on them. I am only looking for pairs of successive co-ordinates that are not too close together. If a vehicle is stationary for a long time, there is the potential for thousands of successive co-ordinates to be on top of each other.

Once I find my two co-ordinates, I am manually updating my iterator (i=j-1) so that I don't have to go over the many thousands of co-ordinates repeatedly. My question is, is this good practice? Or is there a viable alternative? I could not find any examples of this online. I saw the 'continue' statement, however this seemed like it would require an extra if statement, and the manual update was more 'elegant'.

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
}
4

3 に答える 3

4

はい。それは悪い習慣です。コンパイルして問題なく実行できますが、質問への回答としては、悪い習慣です。

イテレータを手動で更新する場合は、whileループを使用します。

forループでできることはすべて、ループでも実行できwhileます。どのループを実際に実装するかの選択は、可読性の問題です。ループではfor、イテレータが update ステートメントで更新され、update ステートメントでのみ更新されることを期待しています。

イテレータが update ステートメントでのみ更新されるようにループを書き直す方法がわからない場合は、次のようなことを検討してください。

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

例として。これは、コードを書き直して 18 行目 (または任意の行) で更新されないようにするよりはまだ悪いですが、18 行目で更新して update ステートメントにコメントを残さないよりははるかに優れています。

または、この回答に関するコメントごとに、これを試してください:

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

この場合、更新ステートメントは完全に空であるため、/*see body*/コメントがなくても、コードを管理している人iは、本体内のどこかを変更する必要があることを既に知っています。update ステートメントの動作は、ループの最後の行として++i追加するだけで再現できます。++ifor

于 2013-10-30T02:53:11.173 に答える
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
    }
}
于 2013-10-30T03:02:08.553 に答える