从文件读取字符存入二维数组仅返回最后循环值的修复问题
问题分析与修复方案
兄弟,你遇到的核心问题确实是循环赋值逻辑错误,导致每一次读取新行时都覆盖了二维数组的所有行,最终所有行都变成了最后一次读取的内容。咱们来拆解问题并给出修复方案:
错误点梳理
你的伪代码里有两个关键错误:
- 多余的嵌套循环覆盖所有行:每次读取一行后,你用两层for循环遍历了整个二维数组的所有行和列,把每一行都赋值成当前的
spliter[0]。这就意味着,每读一行,之前所有行的数据都会被覆盖成当前行的内容,最后自然全是最后一行的数据。 - 丢失第一行数据:在进入while循环前,你先执行了
input.nextLine(),这会跳过文件的第一行,导致这行数据根本没被处理。
修复后的伪代码
修改核心逻辑,只把当前读取的行赋值给二维数组对应的行,而不是所有行:
fillFromFile (parameters){ Scanner input = new Scanner(new FileReader(fileName));//来自参数 int rowCount = parm; // 明确行数变量,方便理解 char[][] returnChar = new char[rowCount][parm];//由参数获取行列数 int currentRow = 0; // 移除开头的input.nextLine(),避免丢失第一行 while (input.hasNextLine() && currentRow < rowCount) { String line = input.nextLine(); String[] spliter = line.split(" ", 2); // 只处理当前行(currentRow对应的行),而非所有行 for (int col = 0; col < returnChar[currentRow].length; col++) { // 确保字符索引不越界(可选但推荐) if (col < spliter[0].length()) { returnChar[currentRow][col] = spliter[0].charAt(col); } else { // 可以在这里处理列数不匹配的情况,比如填充默认字符 returnChar[currentRow][col] = ' '; } } currentRow++; // 处理完当前行后,行数自增 } return returnChar; }
为什么深拷贝没用?
你之前尝试深拷贝但没效果,是因为原数组在填充阶段就已经被错误覆盖了——拷贝一个本身就错误的数组,结果当然还是错误的。只有先把填充逻辑改对,深拷贝才有意义(比如需要避免外部修改返回的数组时)。
额外注意事项
- 要确保
spliter[0]的长度和二维数组每行的列数匹配,否则charAt(col)会抛出索引越界异常,上面的修复代码里加了简单的判断处理这种情况; - 循环条件里的
currentRow < rowCount要严格遵守,避免数组越界; - 如果你文件里的行格式是用空格分隔的单个字符(比如
r e),split(" ", 2)可能不是你想要的——应该用split(" ")拆分出每个字符的字符串,再转成char,示例如下:
这部分可以根据你的实际文件格式调整。String[] chars = line.split(" "); for (int col = 0; col < returnChar[currentRow].length; col++) { if (col < chars.length) { returnChar[currentRow][col] = chars[col].charAt(0); } }
内容的提问来源于stack exchange,提问作者user7800326
相关产品推荐
相关产品推荐

