Array重复添加相同的字符?

时间:2015-10-21 17:34:00

标签: java arrays conways-game-of-life

我试图打印出从文本文件中读取的点和X网格,但由于某种原因,它只需要一个点并一遍又一遍地重复添加到数组中,而不是读取每个个体字符并将其添加到其各自位置的数组。我该如何解决这个问题?

代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class Project4 {

    public static void main(String[] args) throws IOException {
        Scanner input = new Scanner(System.in); // Created a scanner
        System.out.println("Enter the file name you would like to use");
        File file = new File(input.nextLine()); // Takes file name to find file
        Scanner inputFromFile = new Scanner(file);
        FileInputStream fileInput = new FileInputStream(file); // reads file
        int r;
        while ((r = fileInput.read()) != -1) { // goes through each character in
                                                // file, char by char
            char c = (char) r;
            for (int i = 0; i < 25; i++) {
                for (int y = 0; y < 75 ; y++) { // Adds file values to Array
                    GameOfLife.grid[i][y] = c;
                }
            }
        }
        // Prints the initial environment
        System.out.println("Initial set: ");
        for (int j = 0; j < GameOfLife.grid.length; j++)
            System.out.println(GameOfLife.grid[j]);
    }
}

GameOfLife:

import java.util.Arrays; 

public class GameOfLife {

static final int m = 25; // number of rows
static final int n = 75; // number of columns 
static char[][] grid = new char [m][n]; // Creates an empty (no dots or X's)grid of rows and columns. 

}

例如:

预期产量: Expected output

Actual output

3 个答案:

答案 0 :(得分:1)

考虑这个块

100

每次读到一个字符时,它都会通过并覆盖该字符的每个单元格,这意味着它只包含最后读取的任何字符。

如果您想在阅读时跟踪坐标,请删除像这样的for循环

    while ((r = fileInput.read()) != -1) { // goes through each character in
                                            // file, char by char
        char c = (char) r;
        for (int i = 0; i < 25; i++) {
            for (int y = 0; y < 75 ; y++) { // Adds file values to Array
                GameOfLife.grid[i][y] = c;
            }
        }
    }

答案 1 :(得分:0)

中心for循环是问题所在。如上所述,您可以将读取的每个字符存储在2D数组中的每个位置。您也可以这样实现它:

    FileInputStream fileInput = new FileInputStream(file); // reads file
    int r;                                                 // file, char by char
    for (int i = 0; i < 25; i++) {
        for (int y = 0; y < 75 ; y++) { // Adds file values to Array
            r = fileInput.read()) != -1; // goes through each character in
            if( r == -1 ) break;
            char c = (char) r;
            GameOfLife.grid[i][y] = c;
        }
    }

哪个更好,我不确定。这种方式保留了嵌套循环与数组的熟悉结构,但如果文件输入结束,它可以提前退出,如果输入实际上意外结束,则可能导致错误。

答案 2 :(得分:0)

您正在使用每个角色填充整个数组,因为您已经嵌套了循环。我认为您应该将grid初始化为'.'(因为这似乎是空的)。

不需要成为一个单独的类来包含你的数组,我将它变成一个局部变量,除非你打算将更多的功能移入其中(但是那么一切都不应该是{ {1}})。我建议你使用try-with-resources来避免泄漏文件句柄。接下来,我使用static一次读取一行文件(跳过空行和无效字符)。而且,您可以使用Arrays.deepToString(Object[])打印Scanner。像

这样的东西
grid