如何将输入文件值传递至其他方法?Java矩阵数据丢失求助
问题分析与修复方案
首先,咱们来拆解你遇到的问题:
核心问题1:y变量未在每行开始时重置为0
你在读取每行数据的时候,y只会不断自增,但没有在处理新一行前重置为0。举个例子:如果第一行有3个元素,y会变成3;处理第二行时,你会从matrix[x][3]开始赋值,而matrix[x][0]、matrix[x][1]、matrix[x][2]这些位置依然是默认的0。这就导致你的矩阵数据完全错位,大部分位置都是0。
核心问题2:固定大小的静态数组与实际数据不匹配
你初始化了一个10000x10000的超大静态数组,但实际读取的测试数据行数和列数肯定远小于这个值。当你在isDeadlock方法里遍历整个数组时,那些未被赋值的行和列自然都是默认的0,看起来就像数据没被保留一样。
修复步骤与代码示例
第一步:快速修复y的重置问题
如果想继续使用原有的静态数组,只需要在每次读取新行时把y重置为0,确保每行数据从第0列开始填充:
while ((line = in.readLine()) != null) { y = 0; // 关键:每行开始时重置y为0 String[] values = line.split(","); for (String str : values) { int str_int = Integer.parseInt(str); matrix[x][y] = str_int; System.out.print(matrix[x][y] + " "); y = y + 1; } System.out.println(""); x = x + 1; }
第二步:改用动态集合存储数据(更优方案)
固定大小的数组很容易造成空间浪费和数据错位,建议先用List<List<Integer>>动态存储读取到的矩阵数据,最后再转成合适大小的二维数组。这样isDeadlock方法里遍历的就是真实有效的数据,不会出现大量无效的0:
修改后的完整代码示例:
import java.io.*; import java.util.*; public class Findcycle { // 不再使用固定大小的静态数组,改用动态集合存储 public static void main(String[] args) { List<List<Integer>> matrixList = new ArrayList<>(); try { BufferedReader in = new BufferedReader(new FileReader("TestCase1.txt")); String line; while ((line = in.readLine()) != null) { List<Integer> row = new ArrayList<>(); String[] values = line.split(","); for (String str : values) { int str_int = Integer.parseInt(str); row.add(str_int); System.out.print(str_int + " "); } matrixList.add(row); System.out.println(""); } in.close(); // 将动态集合转为二维int数组 int[][] matrix = new int[matrixList.size()][]; for (int i = 0; i < matrixList.size(); i++) { List<Integer> row = matrixList.get(i); matrix[i] = row.stream().mapToInt(Integer::intValue).toArray(); } System.out.println(isDeadlock(matrix)); } catch (IOException ioException) { // 不要空catch块,打印异常方便调试问题 ioException.printStackTrace(); } } public static class Node { int id; List<Node> getNodes = new ArrayList<Node>(); public Node(int id) { this.id = id; } } public static String isDeadlock(int matrix[][]) { List<Node> nodes = new ArrayList<Node>(); // 现在遍历的是真实有效的数据,不会有多余的0 for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { System.out.println(matrix[i][j]); } } // 这里补充你原来的死锁判断逻辑... return "处理结果"; } }
额外建议:不要忽略异常
你的代码里catch( IOException ioException ) {}是空的,这样如果读取文件时出现错误(比如文件找不到、格式错误),你完全不知道问题出在哪。一定要在catch块里打印异常信息,方便快速定位问题。
内容的提问来源于stack exchange,提问作者Jess Brown
相关产品推荐
相关产品推荐

