从文本文件

时间:2017-03-25 19:08:30

标签: java arrays text double

我有一个文本文件

0.4658 0 3
0.4095 0 3
0.4594 0 3
0.4297 0 3
0.3963 0 3
0.4232 0 3
0.4633 0 3
0.5384 0 3
0.5042 0 3
0.4328 0 3

我想读入一个看起来像这样的2D双数组。

{{0.4658, 0, 3},
 {0.4095, 0, 3},
    ... (and so on)
 {0.4328, 0, 3}}

我有以下代码:

public static void main(String[] args) throws Exception{
    double[][] ref = null;

    ref = matrix("data80.in",10,3);

 }

public static double[][] matrix(String filename, int size1, int size2) throws Exception {
    double[][] matrix = null;

    BufferedReader buffer = new BufferedReader(new FileReader(filename));

    String line;
    int row = 0;

    while ((line = buffer.readLine()) != null) {
        String[] vals = line.trim().split("\\s+");


        if (matrix == null) {
            matrix = new double[size1][size2];
        }

        for (int col = 0; col < size1; col++) {
            matrix[row][col] = Double.parseDouble(vals[col]);
        }

        row++;
    }
    buffer.close();
    return matrix;
}

但它一直给我一个outOfBounds异常,我不知道我哪里出错了。请帮忙。如果有人有更有效的解决方案以及我的问题,那将会很有帮助

3 个答案:

答案 0 :(得分:0)

您已将2d矩阵定义为

matrix = new double[size1][size2];

表示有size1行和size2列,但在以下行中:

for (int col = 0; col < size1; col++) {

您使用过size1。所以更正是:

for (int col = 0; col < size2; col++) {

答案 1 :(得分:0)

这是因为以下for循环:

for (int col = 0; col < size1; col++) {
   matrix[row][col] = Double.parseDouble(vals[col]);
}

我们正在使用size1,而我们应该使用size2,以下工作:

for (int col = 0; col < size2; col++) {
   matrix[row][col] = Double.parseDouble(vals[col]);
}

此外,null循环内无需for检查,您可以将其删除并在开头初始化array,例如:

public static double[][] matrix(String filename, int size1, int size2) throws Exception {
    double[][] matrix = new double[size1][size2];;

    BufferedReader buffer = new BufferedReader(new FileReader(filename));

    String line;
    int row = 0;

    while ((line = buffer.readLine()) != null) {
        String[] vals = line.trim().split("\\s+");


        for (int col = 0; col < size2; col++) {
            matrix[row][col] = Double.parseDouble(vals[col]);
        }

        row++;
    }
    buffer.close();
    return matrix;
}

答案 2 :(得分:0)

这是关于如何将包含在任意数量的行和任意数量的列的文本文件中的分隔数字数据放入Double数据类型二维数组的另一个概念。您需要做的就是将路径和文件名传递给方法。您还可以可选提供文件中使用的分隔符,方法默认为逗号(,)分隔符,因为它是最常用的分隔符之一。这是方法:

public static double[][] matrix(String filename, String... delimiterInFile) {
    String delimiter = ","; // Default data delimiter in file.
    // See if a optional data delimiter is supplied...
    if (delimiterInFile.length > 0) { delimiter = delimiterInFile[0]; }

    // Catch IO Exceptions
    try {
        //Place the contents of file into a ArrayList
        List<String> list = Files.lines(Paths.get(filename)).collect(Collectors.toList());

        // Get the greatest number of delimited columns contiained 
        // within the ArrayList the whole while ignoring blank lines
        // (there could be blank lines in file). Our columns for our
        // double 2D Array will be determined from this value. We also 
        // determine the true number of rows required (remember, no
        // blank elements allowed so ArrayList.size() wont be good enough).
        int r = 0, c = 0;
        for (int i = 0; i < list.size(); i++) {
            if (!list.get(i).equals("")) {
                int l = list.get(i).split(delimiter).length;
                if (l > c) { c = l; }
                r++;
            }
        }

        // If we have nothing then the get outta here 
        // by returning null.
        if (r == 0 || c == 0) { return null; }

        // Declare and initialize a double data type 2D Array
        double[][] array = new double[r][c];

        // Fill the double type array...
        for (int i = 0; i < list.size(); i++) {
            if (!list.get(i).equals("")) {
                String[] data = list.get(i).split(delimiter);
                for (int j = 0; j < data.length; j++) {
                    array[i][j] = Double.parseDouble(data[j]);
                }
            }
        }
        return array;
    } catch (IOException ex) { 
        // Do what you want with the Exception...
        ex.printStackTrace();
        return null;
    }
}

此方法将自动确定返回的Double数据类型2D数组所需的行数和列数。该方法忽略空白文件行,因此确定返回的Double 2D数组所需的所需行数。通过迭代数据线并检测哪个数据行包含分隔数据来确定列数值。该列计数用于整个2D阵列。这意味着包含较少列的文件数据行将使其剩余的数组元素填充 0.0 双重类型值。

可以传递给此方法的可选分隔符可以是任何字符串或RegEx(Regular Expression)字符串,例如:" ""\\s+"","", ""\t"

如果访问提供的数据文件时出现问题,此方法也会抛出IO Exception

使用您提供的数据文件架构:

0.4658 0 3
0.4095 0 3
0.4594 0 3
0.4297 0 3
0.3963 0 3
0.4232 0 3
0.4633 0 3
0.5384 0 3
0.5042 0 3
0.4328 0 3

并假设此文件名为data.txt,该文件位于classpath,您可以使用此方法:

double[][] myData = matrix("data.txt", "\\s+");
for (int i = 0; i < myData.length; i++) {
    String strg = "";
    for (int j = 0; j < myData[0].length; j++) {
         strg+= myData[i][j] + " ";
    }
    System.out.println(strg);
}

请记住,这不是我推荐用于真正大型数据文件的方法(数十万行)。