手动更新for循环迭代器是不是很糟糕?

时间:2013-10-30 02:52:07

标签: java processing-efficiency

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

一旦找到我的两个坐标,我就会手动更新我的迭代器(i = j-1),这样我就不必反复重复数千个坐标。我的问题是,这是一个好习惯吗?还是有可行的选择吗?我在网上找不到这个例子。我看到了'continue'语句,但这似乎需要额外的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
}

3 个答案:

答案 0 :(得分:3)

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

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

使用for循环可以执行的任何操作也可以使用while循环完成。在实际实现的循环中的选择是可读性问题。在for循环中,人们希望迭代器在update语句中更新,并且只在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添加为++i循环的最后一行,即可重新创建update语句中的for行为。

答案 1 :(得分:0)

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

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

我认为这意味着i从0开始一直增加1,直到达到latLngSize。我没有进一步了解i更改的其他实例。因此,只有在您不介意招致所有未来开发人员的愤怒时,才能更改i,这是您的风险。

答案 2 :(得分: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
    }
}