Получение текстового файла в двумерный рваный массив в Java - PullRequest
0 голосов
/ 13 ноября 2009

Эй, ребята, это продолжение моего предыдущего вопроса . Теперь у меня есть текстовый файл, который отформатирован так:

100 200
123
124 123 145

То, что я хочу сделать, это получить эти значения в двумерный рваный массив в Java. То, что у меня есть, так это:

public String[][] readFile(String fileName) throws FileNotFoundException, IOException {
       String line = "";
       ArrayList rows = new ArrayList();


       FileReader fr = new FileReader(fileName);
       BufferedReader br = new BufferedReader(fr);

       while((line = br.readLine()) != null) {
        String[] theline = line.split("\\s");//TODO: Here it adds the space between two numbers as an element
        rows.add(theline);
       }
       String[][] data = new String[rows.size()][];
       data = (String[][])rows.toArray(data);
       //In the end I want to return an int[][] this a placeholder for testing
       return data;

Моя проблема в том, что, например, для строки 100 200 переменная "theline" имеет три элемента {"100","","200"}, которые затем передаются в строки с rows.add(theline) Я хочу иметь только цифры и, если возможно, как преобразовать этот массив String [] [] в массив int [] [] в конце, чтобы вернуть его. Спасибо!

Ответы [ 4 ]

2 голосов
/ 13 ноября 2009

Если вы используете класс Scanner, вы можете продолжать вызывать nextInt ()

Например (это p-код ... вам нужно его почистить)

scanner = new Scanner(line);
while(scanner.hasNext())
  list.add(scanner.nextInt())
row = list.toArray()

Это, конечно, тоже не очень оптимизировано.

1 голос
/ 13 ноября 2009

вместо использования .split () вы можете попробовать использовать StringTokenizer , чтобы разбить ваши строки на числа

0 голосов
/ 21 ноября 2009

ОК, это решение, основанное на том, что предложил Гонзо:

public int[][] readFile(String fileName) throws FileNotFoundException, IOException {
   String line = "";
   ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();


   FileReader fr = new FileReader(fileName);
   BufferedReader br = new BufferedReader(fr);

   int r = 0, c = 0;//Read the file
   while((line = br.readLine()) != null) {
       Scanner scanner = new Scanner(line);
       list.add(new ArrayList<Integer>());
       while(scanner.hasNext()){

           list.get(r).add(scanner.nextInt());
           c++;
       }
       r++;
   }

   //Convert the list into an int[][]
   int[][] data = new int[list.size()][];
   for (int i=0;i<list.size();i++){
       data[i] = new int[list.get(i).size()];
      for(int j=0;j<list.get(i).size();j++){
          data[i][j] =  (list.get(i).get(j));
      }


   }
   return data;
}
0 голосов
/ 13 ноября 2009

Ваш анализ работает нормально, когда я попробовал. оба

 line.split("\\s");

и

 line.split(" ");

разбить пример данных на нужное количество строковых элементов. (Я понимаю, что версия "\ s" - лучший способ сделать это)

Вот грубый метод преобразования массивов в массивы int

int [][] intArray = new int[data.length][];
for (int i = 0; i < intArray.length; i++) {
    int [] rowArray =  new int [data[i].length];
    for (int j = 0; j < rowArray.length; j++) {
        rowArray[j] = Integer.parseInt(data[i][j]);
    }
    intArray[i] = rowArray;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...