Чтение файла в многомерное массив
-
09-10-2019 - |
Вопрос
Я хочу прочитать в сетке чисел (n * n) из файла и скопировать их в многомерный массив, один int за раз. У меня есть код, который нужно прочитать в файле и распечатать его, но не знаю, как взять каждый int. Я думаю, что мне нужно разделить метод настраивания и пустой разделитель «», чтобы взять каждый халлер, но после этого я не уверен. Я также хотел бы изменить пустые символы на 0, но это может подождать!
Это то, что я так далеко, хотя это не работает.
while (count <81 && (s = br.readLine()) != null)
{
count++;
String[] splitStr = s.split("");
String first = splitStr[number];
System.out.println(s);
number++;
}
fr.close();
}
Образец файла похож на это (необходимы места):
26 84
897 426
4 7
492
4 5
158
6 5
325 169
95 31
По сути, я знаю, как прочитать в файле и распечатать его, но не знаю, как принимать данные с читателя и поместить его в многомерную массив.
Я только что попробовал это, но он говорит: «Не могу скрыть из строки [] для строки»
while (count <81 && (s = br.readLine()) != null)
{
for (int i = 0; i<9; i++){
for (int j = 0; j<9; j++)
grid[i][j] = s.split("");
}
Решение
На основании вашего файла это то, как я бы сделал это:
Lint<int[]> ret = new ArrayList<int[]>();
Scanner fIn = new Scanner(new File("pathToFile"));
while (fIn.hasNextLine()) {
// read a line, and turn it into the characters
String[] oneLine = fIn.nextLine().split("");
int[] intLine = new int[oneLine.length()];
// we turn the characters into ints
for(int i =0; i < intLine.length; i++){
if (oneLine[i].trim().equals(""))
intLine[i] = 0;
else
intLine[i] = Integer.parseInt(oneLine[i].trim());
}
// and then add the int[] to our output
ret.add(intLine):
}
В конце этого кода у вас будет список int[]
которые можно легко превратить в int[][]
.
Другие советы
private static int[][] readMatrix(BufferedReader br) throws IOException {
List<int[]> rows = new ArrayList<int[]>();
for (String s = br.readLine(); s != null; s = br.readLine()) {
String items[] = s.split(" ");
int[] row = new int[items.length];
for (int i = 0; i < items.length; ++i) {
row[i] = Integer.parseInt(items[i]);
}
rows.add(row);
}
return rows.toArray(new int[rows.size()][]);
}
Редактировать: Вы только что обновили свой пост, чтобы включить файл ввода образца, поэтому следующее не будет работать как для вашего случая. Тем не менее, принцип - это то же самое - токеризировать линию, которую вы прочитали на основе того, что вы хотите разделитель (пробелы в вашем случае), добавьте каждый токен в столбцы строки.
Вы не включали файл ввода образца, поэтому я сделаю несколько основных предположений.
Предполагая, что первая строка вашего входного файла является «n», а остальная часть - это целые числа NXN, которые вы хотите прочитать, вам нужно сделать что-то вроде следующего:
public static int[][] parseInput(final String fileName) throws Exception {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
int n = Integer.parseInt(reader.readLine());
int[][] result = new int[n][n];
String line;
int i = 0;
while ((line = reader.readLine()) != null) {
String[] tokens = line.split("\\s");
for (int j = 0; j < n; j++) {
result[i][j] = Integer.parseInt(tokens[j]);
}
i++;
}
return result;
}
В этом случае пример входного файла будет:
3
1 2 3
4 5 6
7 8 9
который приведет к массиву 3 х 3 с:
row 1 = { 1, 2, 3 }
row 2 = { 4, 5, 6 }
row 3 = { 7, 8, 9 }
Если ваш входной файл не имеет «n» в качестве первой строки, вы можете просто дождаться, чтобы инициализировать свой конечный массив, пока вы не подсчитали токены на первой строке.