如何从文本文件中提取2D数组,并使用charAt将其“复制”到另一个数组中

问题描述 投票:-3回答:1

我正在研究一个项目,必须使用charAt连续将文本文件中数组的元素添加到我要指定的新数组中。数组的大小取决于所使用的文本文件,因此最好假定该文件的内容未知,但是我将提供一个示例。

我在运行代码时仍然不断收到“ StringIndexOutOfBoundException”,但我不确定原因或解决方法。

代码应该做的是用用户输入来获取确切的文本文件位置,然后它将逐行读取并将其添加到新数组中。文本文件数组的前两行是数组的行和列的大小。

我的代码如下:

public static void main(String[] args) throws FileNotFoundException
    {
    System.out.println("Enter the location of the board file using the FULL PATH NAME.");
    Scanner input = new Scanner(System.in);
    String n = input.nextLine();
    input.close();

    File a = new File(n); 

    Scanner sc = new Scanner(a);
    int row = sc.nextInt();
    int col = sc.nextInt();

    char[][] board = new char[row][col];

    for (int numRow = 0; numRow < row+1; numRow ++)
    {
        String string = sc.next();
        for (int numCol = 0; numCol < col+1; numCol++)
        {
            board[row][col] = string.charAt(numCol);   
        }
    }

    sc.close();

    GridGame game = new GridGame (row, col, board);
    game.playGame();

示例输入文本文件:

10 10

EEEEEEEEEEES

SWWWWWWWWW

EEEEEEEEEEES

SWWWWWWWWW

EEEEEEEEEEES

SWWWWWWWWW

EEEEEEEEEEES

SWWWWWWWWW

EEEEEEEEEEES

TWWWWWWWWW

java
1个回答
0
投票

您面临的问题是因为Java array具有从0开始的索引,即第一个元素的索引为0,最后一个元素的索引为array.length - 1。因此,以变量作为array索引的循环不应超过array.length - 1。您的终止条件numRow < row+1numRow的值取为array的长度,而不是array.length - 1的长度。

替换

for (int numRow = 0; numRow < row+1; numRow ++)
{
    String string = sc.next();
    for (int numCol = 0; numCol < col+1; numCol++)
    {
        board[row][col] = string.charAt(numCol);   
    }
}

with

for (int r = 0; r < row && sc.hasNextLine(); r++) {
    board[r] = sc.nextLine().toCharArray();
}

[您需要了解的另一个概念是Java中的2-D数组,即数组的数组,即board[0]应该保存文件第一行中的字符数组,board[1]应该保存文件中第一行的字符数组。文件的第二行,依此类推。现在,如果要访问文件中第三行的第四个字符,则可以将其作为board[2][3]进行访问。

最后但并非最不重要的一点是关于关闭ScannerSystem.in。您永远不要关闭此Scanner,因为它也会关闭System.in。因此,您应该从代码中删除行input.close()

如有任何疑问/问题,请随时发表评论。

[更新]

您也可以将上述单个循环编写为嵌套循环,但这不是必需的。

for (int r = 0; r < row && sc.hasNextLine(); r++) {
    char[] lineChars = sc.nextLine().toCharArray();
    for(int c = 0; c < col; c++) {
        board[r][c] = lineChars [c];
    }
}

您需要嵌套循环才能访问/处理单个字符,但是要存储/访问/处理二维数组的每一行,则不需要嵌套循环。正如我已经提到的,二维数组是一维数组的数组,因此要访问这些一维数组(不是这些一维数组中的单个元素),您需要一个循环,而不是一个嵌套循环。

© www.soinside.com 2019 - 2024. All rights reserved.