Как прочитать сетку данных из текстового файла в Java?
-
28-10-2019 - |
Вопрос
Когда я говорю сетку, я имею в виду многомерный массив. Я хочу это, потому что я делаю 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);
};
}