如何从Java中的文本文件中读取数据的GRID?

时间:2011-03-21 02:57:26

标签: java arrays grid nosuchelementexception

当我说网格时,我指的是一个多维数组。我想要这个,因为我正在制作一个2D游戏,我希望能够从数据文本文件加载级别。可以说,例如,我有这个2D数组level[3][3]。一个简单的3x3地图。我还有一个文本文件:

1 2 3 
4 5 6
7 8 9

在c ++中,我可以做到:

for (x=0; i<map_width; x++)
{
    for (y=0; y<map_height; y++)
    {
        fscanf(nameoffile, "%d", map[x][y]);
    }
}

这会将文本文件的所有内容相应地放入数组中。 然而 我不知道如何在java中这样做。是否有任何类似的等价物只会相应地将数据放入数组?我已经知道扫描仪类,但我不知道如何使用它。我搜索谷歌,无济于事。它没有解释太多。 请帮忙!具体来说,我想知道如何扫描文件并将其读入的任何内容放入数组中的适当位置。

我当前的代码就是这样,但它会抛出NoSuchElementException:

public void loadMap() {
    Scanner sc = null;
    try {
        sc = new Scanner(inputmap);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            map[x][y] = sc.nextInt();
        }
    }

如果inputmap是文件,map[][]是地图上每个图块的数据网格,宽度和高度是在构造函数中预先指定的。

3 个答案:

答案 0 :(得分:0)

在Java中,它的工作方式类似 - 为您的文件创建一个java.util.Scanner对象,并使用它的nextInt方法代替fscanf。

答案 1 :(得分:0)

关于如何实际格式化文本文件,您的问题非常无益。例如,

123 
456
789

非常不同
1 2 3
4 5 6
7 8 9

此外,您还没有提到它们是否总是整齐,或

1 2 3
4 5 6
a b c

等。如果您准确地描述了这些文本文件中的内容,我们可以为您提供更多帮助。我能做的最好的就是向您展示如何使用Scanner来输入一般内容:

for循环在Java中看起来很相似,但你必须初始化一个Scanner对象。

Scanner input = new Scanner(myFile); //whatever file is being read

for (x=0; i<map_width; x++)
{
    for (y=0; y<map_height; y++)
    {
        int nextTile = input.nextInt(); //reads the next int
        // or
        char nextTile = input.nextChar(); //reads the next char
    }
}

除此之外,我需要更多地了解这些输入文件中的实际内容。

编辑:

我直接从您的代码中复制了for循环,但您可能想要交换内部和外部for循环。宽度不应该是内部参数(从左到右阅读)?

答案 2 :(得分:0)

如果您不知道网格的尺寸

    static int[][] readFile(String filename) {
    try {
        File textfile = new File (GridSearchTest.class.classLoader.getResource(filename).toURI());
        Scanner fileScanner = new Scanner(textfile);
        int size = Integer.parseInt(fileScanner.next());
        String line = fileScanner.nextLine();
        int[][] grid = new int [size][size];
        int i = 0;  int j = 0;

        while (fileScanner.hasNextLine()) {
            line = fileScanner.nextLine();
            System.out.println (line);
            Scanner lineScanner = new Scanner(line);
            while (lineScanner.hasNext()) {
                grid[i][j] = Integer.parseInt(lineScanner.next());
                i++;
            }
            lineScanner.close();
            i=0;
            j++;
        }
        fileScanner.close();

        return grid;

    } catch (IOException e) {
        System.out.println("Error reading file: "+ e.getMessage());
        System.exit(0);
    };
}