将数据从文件加载到2D阵列中

时间:2014-07-09 03:59:06

标签: java arrays parsing io multidimensional-array

有问题的文件格式为

1 1 1 1 1 1 1 1 
1 0 0 0 0 0 0 1 
1 0 0 0 0 0 0 1 
1 0 0 0 0 0 0 1 
1 0 0 0 0 0 0 1 
1 1 1 1 1 1 1 1 

我需要一种方法将其解析为像这样的数组

    int[][] array = {{1, 1, 1, 1, 1, 1, 1, 1},
                     {1, 0, 0, 0, 0, 0, 0, 1},
                     {1, 0, 0, 0, 0, 0, 0, 1},
                     {1, 0, 0, 0, 0, 0, 0, 1},
                     {1, 0, 0, 0, 0, 0, 0, 1},
                     {1, 1, 1, 1, 1, 1, 1, 1}};

到目前为止,我已经做了很多工作

        BufferedReader reader = new BufferedReader(new FileReader(fc.getSelectedFile()));
        String line = null;
        int[][] myArray;
        while ((line = reader.readLine()) != null){
            myArray = new int[6][8];
            for(int y = 0; y < myArray.length; y++)
                for (int x = 0; x < myArray[y].length; x++){

                    myArray[y][x] = Integer.parseInt(line);
                    loadedArray[y][x] = myArray[y][x];
                }
        }

它在线程&#34; AWT-EventQueue-0&#34;中抛出异常。 java.lang.NumberFormatException:对于输入字符串:&#34; 1 1 1 1 1 1 1 1&#34; 我和2D阵列从未真正相处......

3 个答案:

答案 0 :(得分:1)

行也从6开始并且增加 - 这会导致您的索引超出范围错误,因为您将无法访问该值。

答案 1 :(得分:0)

在阅读文件之前,您似乎知道行数。因此,每次读取行时都无需重新创建数组。只需逐行解析并以0开始索引。

package test2.newpackage;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;

public class NewMain {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("data/test.txt")); // replaced with my test file here
        String line;
        final int rows = 6; // row count never changes
        int[][] myArray = new int[rows][];
        int currentRow = 0;
        while ((line = reader.readLine()) != null && !line.isEmpty()) {
            // System.out.println(line); // write file content to System.out just to be sure it's the right file
            String[] nums = line.trim().split(" "); // remove spaces at both ends of string before splitting
            int[] intLine = new int[nums.length];
            myArray[currentRow++] = intLine;
            for (int col = 0; col < nums.length; col++) {
                int n = Integer.parseInt(nums[col]);
                intLine[col] = n;
            }
        }
        reader.close();
        System.out.println(Arrays.deepToString(myArray));
    }

}

但是,如果您事先不知道行数,请使用List<int[]>,例如ArrayList<int[]>代替int[][]。完成解析后,您仍然可以转换为数组。

更新

由于您似乎在每行的末尾都有空格,trim在拆分之前:

更改

String[] nums = line.split(" ");

String[] nums = line.trim().split(" ");

编辑:

也许包含数字的最后一行以换行符结尾。为了确保你没有读到只包含空字符串的第7行,我添加了一个空行检查。

编辑2:

由于您仍有问题,我将代码更改为我使用的代码。 (我硬编码了文件)。

由于这不是对以前发布的代码的彻底改变,我只能猜出错误的来源:

  • 您没有正确地重新编译和使用真正使用旧版本的程序
  • 输入文件中的唯一数字是1 s
  • 您的文件选择机制是错误的,实际上您获得的文件与您想象的不同。

您可以通过取消注释外部循环中的行打印来检查读取的文件内容是否是您认为的内容。

答案 2 :(得分:0)

我看到一些问题:

  1. 您收到IndexOutOfBounds,因为当它已经是数组的大小时会增加rows

  2. 在创建2D数组之前,您应该计算文件中的行数

    int rows = 0;
    while (reader.readLine() != null) rows++;
    
  3. 为当前行设置单独的计数器

  4. 在循环的每次迭代中将myArray设置为新矩阵。设置一次,然后在循环中添加它。


  5. int rows = 0, 
        cols = -1;
    String line = null;
    
    // Count number of rows and columns
    while ((line = reader.readLine()) != null) {
        rows++;
        if(cols == -1) cols = line.split(" ").length(); // only set once
    }
    
    // Pretty sure you can't read lines anymore, so close and recreate reader
    reader.close();
    reader = new BufferedReader(new FileReader(fc.getSelectedFile()));
    
    final int[][] myArray = new int[rows][cols];
    
    // Iterate over every row
    for(int row = 0; (line = reader.readLine()) != null; row++){
        String[] nums = line.split(" ");
    
        for (int col = 0; col < cols; col++) {
            myArray[row][col] = Integer.parseInt(nums[col]);            
        }
    }
    
    reader.close();