将txt文件转换为双2d数组

时间:2014-02-12 10:12:00

标签: java arrays 2d

我正在尝试将txt文件读入双打数组。我使用以下代码读取文件的每一行:

String fileName="myFile.txt";
try{

    //Create object of FileReader
    FileReader inputFile = new FileReader(fileName);

    //Instantiate the BufferedReader Class
    BufferedReader bufferReader = new BufferedReader(inputFile);

    //Variable to hold the one line data
    String line;

    // Read file line by line and print on the console
    while ((line = bufferReader.readLine()) != null)   {

        System.out.println(line);

    }

    //Close the buffer reader
    bufferReader.close();

}catch(Exception e){
    System.out.println("Error while reading file line by line:" 
        + e.getMessage());                      
}

但是我想将txt文件存储到2d双数组中。 我已经尝试了上面加载txt的维度。但是我遇到异常catch(NoSuchElementException e)的问题,似乎它无法读取文件。

try {

        while (input.hasNext()) {

            count++;
            if (count == 1) {

                row = input.nextInt();
                r = row;
                System.out.println(row);
                continue;
            } else if (count == 2) {
                col = input.nextInt();
                System.out.println(col);
                c = col;
                continue;
            } else {

                output_matrix = new double[row][col];

                for (int i = 0; i < row; i++) {
                    for (int j = 0; j < col; j++) {

                        String el = input.next();
                        Double temp = Double.valueOf(el);
                        double number = temp.doubleValue();

                        //output_matrix[i][j] = el;
                        output_matrix[i][j] = number;
                        //System.out.print(output_matrix[i][j]+" ");
                    }
                    //System.out.println();
                }
            }
        }

    } catch (NoSuchElementException e) {
        System.err.println("Sfalma kata ti tropopoisisi toy arxeioy");
        System.err.println(e.getMessage());       //emfanisi tou minimatos sfalmatos
        input.close();
        System.exit(0);
    } catch (IllegalStateException e) {
        System.err.println("Sfalma kata ti anagnosi toy arxeioy");
        System.exit(0);
    }

2 个答案:

答案 0 :(得分:1)

您可能希望使用Scanner类,尤其是Scanner.nextDouble()方法。

另外,如果你事先不知道数组的大小 - 我建议使用ArrayList而不是常规数组。

代码示例:

ArrayList<ArrayList<Double>> list = new ArrayList<>();
while ((line = bufferReader.readLine()) != null)   {
    ArrayList<Double> curr = new ArrayList<>();
    Scanner sc = new Scanner(line);
    while (sc.hasNextDouble()) {
        curr.add(sc.nextDouble());
    }
    list.add(curr);
}

答案 1 :(得分:0)

在第一次宣布一份清单并收集所有读取行:

List<String> tempHistory = new ArrayList<>();
while ((line = bufferReader.readLine()) != null) {
    tempHistory.add(line);
}

然后,在bufferReader.close();将此tempHistory列表转换为double[][]数组后。

double[][] array = new double[tempHistory.size()][];
for (int i = 0; i < tempHistory.size(); i++) {
    final String currentString = tempHistory.get(i);
    final String[] split = currentString.split(" ");
    array[i] = new double[split.length];
    for (int j = 0; j < split.length; j++) {
        array[i][j] = Double.parseDouble(split[j]);
    }
}

它有效,但正如我在评论中添加的那样,这是一个不太好的解决方案,最好使用Collections代替array

顺便说一句,即使不同行的行长度不同,它也能正常工作。