2

我有一个程序可以遍历车辆坐标列表,然后对它们执行其他功能。我只是在寻找不太靠近的成对连续坐标。如果车辆长时间静止,则可能会有数千个连续坐标相互重叠。

一旦找到我的两个坐标,我将手动更新我的迭代器 (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
}
4

3 回答 3

4

是的。这是不好的做法。它会编译和运行得很好,但在回答你的问题时,这是不好的做法。

如果要手动更新迭代器,请使用while循环。

for你可以用循环做的任何事情也可以用循环来完成while。选择实际实现的循环是可读性的问题。在for循环中,人们期望迭代器在更新语句中更新,并且只在更新语句中更新。

如果您不知道如何重写循环以使迭代器仅在更新语句中更新,请考虑以下内容:

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来重新创建更新语句的行为。++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 回答
0

是的。这是一个不好的做法。不要这样做。如果我在维护你的代码,我看到了

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

我认为这意味着i从 0 到 . 一遍又一遍地增加 1 latLngSize。我不会进一步寻找其他i变化的实例。因此,i只有在您不介意招致所有未来开发人员的愤怒的情况下,您才能做出改变。

于 2013-10-30T02:56:37.687 回答