0

我想读取一个文本文件并将其插入到二维数组中。这是我的代码。

        List<String> list2 = new ArrayList<String>();

        String thisLine = null;
        while ((thisLine = input1.readLine()) != null) {
        list2.add(thisLine);
        }

        double[][] X;
        X = new double[list2.size()][];

        String[] temp;
        String delims = ",";

        for (int k1 = 0; k1 <= (X.length - 1); k1++) {
            String line = input.readLine();
            temp = line.split(delims);
            for (int i = 0; i < temp.length; i++) {
                X[k1][i] = Double.parseDouble(temp[i]);
            }
        }

问题是它什么都不返回,只要我在二维数组声明行中指定列数,一切都很好。根据我的 Java 知识,二维数组声明中的列数不是必需的,并且在我的项目中(因为我们应用了不同的数据集),没有指定列数。

4

2 回答 2

2

二维数组基本上是一个数组数组。我们称它为由内部数组组成的外部数组。

初始化二维数组时,确实只需要声明外部数组的长度。即行数。通过这样做,只有外部数组将被初始化。内部数组尚未初始化。

事实上,这两个数组将包含完全相同的元素:

double[][] array1 = new double[3][];
double[][] array2 = {null, null, null};

要初始化内部数组,您可以执行以下操作之一:

array1[0] = new double[4];
array1[0] = new double[] {1.0, 3.14, 42.0, 2.718};

在您的情况下,您可以简单地将其放入代码中以初始化内部数组:

temp = line.split(delims);
X[k1] = new double[temp.length]; //<- Add this line
于 2013-05-23T02:18:40.360 回答
1
X = new double[list2.size()][];

您现在已经创建了一个交错数组,它是一个由 绑定的数组数组list2.size()

X[k1][i] = Double.parseDouble(temp[i]);

您试图取消引用锯齿状数组中不存在的点。 这是不好的。

如果未指定规范中的列数,则它由您解析的参数的长度提供,或者由您尝试放入该位置的元素隐式提供。

这会起作用,因为它定义了一个数组,这是锯齿状数组所需要的......

X[k1][i] = new double[] {Double.parseDouble(temp[i])};

...但它只会给你一个有效的二维数组new Double[list2.size()][1]

考虑到您使用String[] temp,也许您想将其用作锯齿状数组的条件?这是一种快速而肮脏的方法,它涉及的变量比我想要的要多,但会起作用:

String[] temp;
double[] tempDouble;

for (int k1 = 0; k1 <= (X.length - 1); k1++) {
    temp = input.readline().split(delims);
    tempDouble = new double[temp.length];
    for(int i = 0; i < temp.length; i++) {
        tempDouble[i] = Double.parseDouble(temp[i]);
    }
    // a bit further down, you can use the array as part of your jagged array.
    X[k1] = tempDouble;
}
于 2013-05-23T01:49:34.927 回答