Как прочитать сетку данных из текстового файла в Java?

StackOverflow https://stackoverflow.com/questions/5373378

Вопрос

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

Мой текущий код - это, однако, он бросает noshelementexception:

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();
        }
    }

Где входная карта - файл, map[][] это сетка данных для каждой из плиток на карте, а ширина и высота предварительно определены в конструкторе.

Это было полезно?

Решение

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

123 
456
789

сильно отличается от

1 2 3
4 5 6
7 8 9

и, кроме того, вы не упомянули, всегда ли они INT, или

1 2 3
4 5 6
a b c

и т. д. Если вы дали нам точное описание именно того, что идет в этих текстовых файлах, мы могли бы помочь вам больше. Лучшее, что я могу сделать, это показать вам, как использовать сканер для ввода в целом:

FOR LOOP будет выглядеть одинаково в Java, но вы должны инициализировать объект сканера.

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
    }
}

Кроме того, мне нужно было бы узнать больше о том, что на самом деле находится внутри этих входных файлов.

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

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

Другие советы

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

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

    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);
    };
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top