You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:18:23