繁体   English   中英

将 .csv 文件读入二维数组

[英]read .csv file into 2D-array

所以我目前正在做我的家庭作业,似乎无法将 .csv 文件放入二维数组中。 问题是我们必须使用 Scanner 和 .split() 方法,没有变通方法。 目前它似乎只将倒数第二行加载到整个数组中。 .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);
    }
}

据我了解,您的问题在于嵌套的 for 循环。 您当前的代码将用最后一行填充整个二维数组。 我的解决方法是在 while 循环内放置一个计数器,去掉其中一个 for 循环,然后它就可以工作了。 我希望这是有道理的

在 while 循环中不需要 2 个循环,这是解决方案。

public class array2D
{
    private static int[][] readArrayFromFile(String filename)
    {
        int[][] array = new int[9][9];
        try
        {
            Scanner myFileReader = new Scanner(new File(filename));

            int i = 0;
            while (myFileReader.hasNextLine())
            {

                String line = myFileReader.nextLine();
                String[] tokens = line.split(";");

                for (int j = 0; j < tokens.length; j++)
                {
                    array[i][j] = Integer.parseInt(tokens[j]);
                }
                i++;
            }
        }
        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/test.csv";
        int[][] sudokuField = readArrayFromFile(filename);
        printArray(sudokuField);
    }
}

不要害怕一次使用多个Scanner

private static int[][] readArrayFromFile(String filename) {
    int[][] array = new int[9][9];
    int rowNum = 0;
    try (Scanner myFileReader = new Scanner(new File(filename))) {

        while (myFileReader.hasNextLine()) {
            String line = myFileReader.nextLine();
            Scanner sRow = new Scanner(line);
            sRow.useDelimiter(";");
            int colNum = 0;
            while (sRow.hasNextInt()) {
                array[rowNum][colNum++] = sRow.nextInt();
            }
            rowNum++;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return array;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM