Как прочитать GRID данных из текстового файла на Java? - PullRequest
0 голосов
/ 21 марта 2011

Когда я говорю сетка, я имею в виду многомерный массив.Я хочу этого, потому что я делаю 2D-игру и хочу загружать уровни из текстовых файлов данных.Скажем, например, у меня есть этот двумерный массив level[3][3].Простая карта 3х3.И у меня также есть текстовый файл, который гласит:

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.Есть ли какой-нибудь эквивалент, который просто поместит данные в массив соответственно?Я уже знаю о классе сканера, но я не знаю, как его использовать.Я искал в Google, но безрезультатно.Это мало что объясняет.Пожалуйста помоги!В частности, я хочу знать, как сканировать файл и помещать в массив все, что он читает, в СООТВЕТСТВУЮЩЕЕ МЕСТО.

Мой текущий код таков, однако он генерирует исключение 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 голосов
/ 21 марта 2011

Ваш вопрос очень бесполезен, когда речь идет о том, как ваши текстовые файлы будут на самом деле отформатированы.Например,

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
    }
}
* 1014Кроме того, мне нужно было бы узнать больше о том, что на самом деле находится внутри этих входных файлов.

РЕДАКТИРОВАТЬ:

Я скопировал ваш цикл for непосредственно из вашего кода, но вы можете поменять местамивнутренний и внешний для петель.Разве ширина не должна быть внутренним параметром (чтение слева направо)?

0 голосов
/ 24 марта 2016

Если вы не знаете размеры сетки

    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);
    };
}
0 голосов
/ 21 марта 2011

В Java это работает аналогично - создайте объект java.util.Scanner для вашего файла и используйте его метод nextInt вместо fscanf.

...