如何在Java中用for循环实现城市间(排除自身)的距离计算?
城市间距离计算的遍历循环实现
需求
现有Java代码初始化了4个城市对象,每个城市包含坐标信息。需用for循环替代手动代码,实现每个城市调用Distance方法,计算与自身以外所有其他城市的距离,达到和手动调用完全一致的输出效果。
现有Lab2类代码
public class Lab2 { public static Cities [] PathSolution = new Cities[7]; int PathIndex = 0; int StartCity; static Cities [] City = new Cities [4]; public static void main(String[] args){ for(int i = 0; i<City.length; i++) City[i] = new Cities(); City[0].Initialization ( 0, 1, 1); City[1].Initialization ( 1, 5, 5); City[2].Initialization ( 2, 10, 3); City[3].Initialization ( 3, 2, 7); // 此处需添加循环代码 } }
手动调用的目标效果
以下是需要用循环替代的手动代码:
City[0].Distance(5, 5); City[0].Distance(10, 3); City[0].Distance(2, 7); City[1].Distance(1, 1); City[1].Distance(10, 3); City[1].Distance(2, 7); City[2].Distance(1, 1); City[2].Distance(5, 5); City[2].Distance(2, 7); City[3].Distance(1, 1); City[3].Distance(5, 5); City[3].Distance(10, 3);
尝试的错误循环代码
以下是未成功的循环实现:
for (int i = 0; i < City.length; i++) { City[i].Distance(5, 5); i++; City[i].Distance(10,3); i++; City[i].Distance(2,7); i++; }
Distance方法实现
public void Distance(float x, float y) { int dist = (int) Math.sqrt(Math.pow(City_X_Location - x , 2) + Math.pow(City_Y_Location - y , 2)); System.out.println(dist); }
注:原代码中
sqrt需加上Math.前缀,否则会编译错误
预期输出
3 8 0 6 8 0 6 3 0 6 3 8
正确解决方案
错误原因分析
你写的循环存在两个核心问题:
- 手动自增
i会导致索引越界,且无法遍历所有城市 - 硬编码目标坐标,无法灵活适配城市数量变化
正确实现代码
使用嵌套循环:外层遍历当前城市,内层遍历所有城市,排除自身后调用Distance方法,传入目标城市的坐标:
方案1:若Cities类的坐标字段为public
// 在main方法中添加这段代码 for (int i = 0; i < City.length; i++) { for (int j = 0; j < City.length; j++) { if (i != j) { // 跳过自身 City[i].Distance(City[j].City_X_Location, City[j].City_Y_Location); } } }
方案2:若Cities类的坐标字段为private(推荐封装)
先在Cities类中添加坐标的getter方法:
public class Cities { private float City_X_Location; private float City_Y_Location; // ...其他代码(Initialization方法等) public float getCityX() { return City_X_Location; } public float getCityY() { return City_Y_Location; } }
再修改循环代码:
// 在main方法中添加这段代码 for (int i = 0; i < City.length; i++) { for (int j = 0; j < City.length; j++) { if (i != j) { // 跳过自身 City[i].Distance(City[j].getCityX(), City[j].getCityY()); } } }
效果说明
这段嵌套循环会遍历所有城市对(i,j),其中i≠j,完全复现手动调用的逻辑,输出结果与预期一致。
内容的提问来源于stack exchange,提问作者NewCoder2001
相关产品推荐
相关产品推荐

