Java二维数组计算结果不符问题求助
问题分析与修复方案
我仔细检查了你的代码、输入数据和预期逻辑,发现了几个关键问题——既有编译层面的错误,也有导致输出不符合预期的核心逻辑问题,下面逐一说明并给出修复方案:
1. 变量作用域错误
你在if(count==0)和if(count==1)的代码块内部定义了n、m、Cost、VMs这些变量,这意味着它们的作用域仅局限于当前代码块,在循环外部和后续计算逻辑中根本无法访问。这会直接导致编译错误,你能运行的话可能是实际代码有调整,但这个问题必须优先修正——把这些变量的声明移到while循环外面。
2. 输入读取的索引逻辑错误
你的输入读取逻辑跳过了count==2的行:
count==0读取n,count==1读取m后,count==2应该是Cost数组的第一行,但你的代码判断条件是count>=3 && count<n+3,这就漏掉了这一行,导致Cost数组少读一行,后续VMs数组也会读取错误的行数据。
3. 核心计算逻辑错误
这是输出不符合预期的关键原因!根据你给出的计算示例,NewCost[i][j]应该基于上一行计算好的NewCost值来推导,而不是原始的Cost值:
// 你的错误代码 y = Cost[i-1][k] + Cost[i][j] + Vms[k][j]; // 正确逻辑 y = NewCost[i-1][k] + Cost[i][j] + VMs[k][j];
你误用了原始的Cost[i-1][k]而非已经优化过的NewCost[i-1][k],直接导致后续所有行的计算结果偏差。
4. 其他细节错误
- Java大小写敏感:你定义的数组是
VMs,但计算时写成了Vms,会导致找不到变量的编译错误。 - 未声明变量
y:直接使用y会触发编译错误,需要添加int y;声明。 - 未初始化BufferedReader:
br = null;直接调用br.readLine()会抛出NullPointerException,需要添加文件初始化逻辑。 - 赋值逻辑遗漏:原代码仅在
y < a时给NewCost[i][j]赋值,若所有y都不小于初始a(虽当前场景不会出现,但逻辑不严谨),会导致NewCost[i][j]保持默认值0。
修正后的完整代码
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class CostCalculator { public static void main(String[] args) throws IOException { String path = args[0]; BufferedReader br = new BufferedReader(new FileReader(path)); // 初始化读取流 String line; int count = 0; // 把需要跨作用域访问的变量移到循环外声明 int n = 0; int m = 0; int[][] Cost = null; int[][] VMs = null; while ((line = br.readLine()) != null) { if (count == 0) { n = Integer.parseInt(line.trim()); } else if (count == 1) { m = Integer.parseInt(line.trim()); Cost = new int[n][m]; VMs = new int[m][m]; } else if (count >= 2 && count < n + 2) { // 修正Cost数组读取起始索引 String[] spliter = line.split("\\s+"); for (int j = 0; j < m; j++) { Cost[count - 2][j] = Integer.parseInt(spliter[j]); } } else if (count >= n + 2 && count < n + 2 + m) { // 修正VMs数组读取范围 String[] spliter = line.split("\\s+"); for (int k = 0; k < m; k++) { VMs[count - (n + 2)][k] = Integer.parseInt(spliter[k]); } } count++; } br.close(); // 关闭流资源 int[][] NewCost = new int[n][m]; // 初始化第一行 for (int w = 0; w < m; w++) { NewCost[0][w] = Cost[0][w]; } // 计算后续行 for (int i = 1; i < n; i++) { for (int j = 0; j < m; j++) { int a = 10000; for (int k = 0; k < m; k++) { int y = NewCost[i-1][k] + Cost[i][j] + VMs[k][j]; // 修正核心计算逻辑 if (y < a) { a = y; } } NewCost[i][j] = a; // 确保每次都赋值最小值 } } // 输出结果 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { System.out.print(NewCost[i][j] + " "); } System.out.println(); } } }
验证结果
用你提供的输入数据运行修正后的代码,会得到和预期完全一致的输出:
5 6 3 12 13 8 17 18 11 15 20 17
内容的提问来源于stack exchange,提问作者Chris P.
相关产品推荐
相关产品推荐

