Чтение файла в многомерный массив - PullRequest
2 голосов
/ 19 октября 2010

Я хочу прочитать сетку чисел (n * n) из файла и скопировать их в многомерный массив, по одному int за раз.У меня есть код для чтения в файле и распечатать его, но не знаю, как взять каждый int.Я думаю, что мне нужно метод splitstring и пустой разделитель "", чтобы взять каждый символ, но после этого я не уверен.Я также хотел бы изменить пустые символы на 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

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

Я только что попробовал это, но там написано, что «невозможно покрыть от String [] до String»

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

    }

Ответы [ 3 ]

0 голосов
/ 19 октября 2010
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()][]);
}
0 голосов
/ 19 октября 2010

Исходя из вашего файла, вот как я бы это сделал:

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[][].

0 голосов
/ 19 октября 2010

РЕДАКТИРОВАТЬ: Вы только что обновили свое сообщение, добавив в него пример входного файла, поэтому следующее не будет работать как есть для вашего случая. Однако принцип тот же: токенизируйте строку, которую вы прочитали, на основе того, какой разделитель вы хотите (пробелы в вашем случае), а затем добавьте каждый токен в столбцы строки.

Вы не включили пример входного файла, поэтому я сделаю несколько основных предположений.

Предполагая, что первая строка вашего входного файла - "n", а остальные - n x n целых чисел, которые вы хотите прочитать, вам нужно сделать что-то вроде следующего:

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 x 3 с:

row 1 = { 1, 2, 3 }
row 2 = { 4, 5, 6 }
row 3 = { 7, 8, 9 }

Если ваш входной файл не имеет "n" в качестве первой строки, то вы можете просто подождать, чтобы инициализировать ваш окончательный массив, пока не подсчитаете токены в первой строке.

...