我有一个循环在车辆坐标列表上的程序,然后对它们执行其他功能。我只是寻找一对不太靠近的连续坐标。如果车辆长时间静止不动,则有数千个连续坐标可能相互叠加。
一旦找到我的两个坐标,我就会手动更新我的迭代器(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
}
答案 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
}
}