Java使用Scanner和split读取CSV到二维数组仅加载倒数第二行问题
问题背景
- 作业约束:必须使用
Scanner类和.split()方法将.csv格式的数独文件读取为9×9二维int数组,禁止使用其他替代API - 异常表现:代码运行后整个二维数组仅加载了文件倒数第二行的数据,其余位置数据要么被覆盖要么为空
测试用.csv文件内容
8;2;0;1;4;5;7;6;9 9;0;4;2;6;7;3;0;8 7;6;0;3;8;9;4;5;2 1;0;0;7;9;0;5;4;0 5;0;6;4;2;0;0;3;7 0;0;9;5;3;6;8;2;1 3;9;7;6;1;4;0;8;0 0;0;8;9;5;2;0;7;3 2;0;5;0;0;3;6;0;4
现有完整代码(仅readArrayFromFile方法内while循环逻辑可修改,其余为题目预置代码不可改动)
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class array2D{ private static int[][] readArrayFromFile(String filename) { int[][] array = new int[9][9]; try { Scanner myFileReader = new Scanner(new File(filename)); while (myFileReader.hasNextLine()) { String line = myFileReader.nextLine(); String[] tokens = line.split(";"); for (int i = 0; i < tokens.length; i++) { for (int j = 0; j < tokens.length; j++) { if (myFileReader.hasNext()) { array[i][j] = Integer.parseInt(tokens[j]); } } } } } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } return array; } private static void printArray(int[][] inputArray) { for (int y = 0; y < inputArray.length; y++) { for (int x = 0; x < inputArray[y].length; x++) { System.out.print(inputArray[y][x] + "\t"); } System.out.println(); } System.out.println(); } public static void main(String[] args) { String filename = "./src/sudoku1.csv"; int[][] sudokuField = readArrayFromFile(filename); printArray(sudokuField); } }
故障原因
- 行索引未和文件读取进度绑定:每次读取到新行时,内层双层循环都从二维数组的第0行开始写入,之前读取存入的行会被新数据逐次覆盖
- 无效的流状态判断:
if (myFileReader.hasNext())用于判断Scanner输入流是否还有未读内容,和当前行拆分出的tokens数组没有关联,读取到文件最后一行时该判断返回false,导致最后一行数据无法写入 - 冗余循环逻辑:单行拆分得到的
tokens数组对应当前行的9个列值,不需要双层循环重复遍历
修复方案(仅修改while循环内部逻辑,符合作业约束)
private static int[][] readArrayFromFile(String filename) { int[][] array = new int[9][9]; try { Scanner myFileReader = new Scanner(new File(filename)); // 维护行索引,标记当前写入二维数组的行位置 int rowIndex = 0; while (myFileReader.hasNextLine()) { String line = myFileReader.nextLine(); String[] tokens = line.split(";"); // 遍历当前行所有列,写入对应位置 for (int colIndex = 0; colIndex < tokens.length; colIndex++) { array[rowIndex][colIndex] = Integer.parseInt(tokens[colIndex]); } // 当前行写完,行索引自增 rowIndex++; } myFileReader.close(); } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } return array; }
修复逻辑说明:单独维护行号计数器,每读一行就把拆分得到的元素写入计数器对应的二维数组行,写完后行号+1,既避免了重复覆盖之前的行数据,也去掉了干扰赋值的多余流判断,完全符合作业要求的
Scanner+.split()实现规则。
内容的提问来源于stack exchange,提问作者0xCorvo
相关产品推荐
相关产品推荐

