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



所讨论的文件的格式如下

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];
                }
        }
java.lang.NumberFormatException: For input string: "1 1 1 1 1 1 1 1 1 1 "

Rows也从6开始并增加-这会导致索引越界错误,因为您将无法访问该值。

您在读取文件之前似乎知道行数。因此,不需要在每次读取该行时重新创建数组。只需逐行解析,索引从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
  • 你的文件选择机制是错误的,你实际上得到的文件与你想象的不同。

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

我看到几个问题:

  1. 你得到IndexOutOfBounds是因为你增加了rows,当它已经是数组的大小

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

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

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


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

相关内容

  • 没有找到相关文章

最新更新