我想读取一个文本文件并将其插入到一个2d数组中。这是我的密码。
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]);
}
}
问题是它什么都不返回,只要我指定了2d数组声明行中的列数,一切都很好。根据我的java知识,2d数组声明中的列数是不必要的,并且在我的项目中(由于我们应用了不同的数据集(,没有指定列数。
2d数组基本上是数组的数组。让我们称之为由内部数组组成的外部阵列。
初始化2d数组时,确实只需要声明外部数组的长度。即行数。这样,只有外部数组才会被初始化。内部数组尚未初始化。
事实上,这两个数组将包含完全相同的元素:
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
X = new double[list2.size()][];
现在您已经创建了一个锯齿状数组,它是一个由list2.size()
绑定的数组数组。
X[k1][i] = Double.parseDouble(temp[i]);
您试图取消引用锯齿状数组中不存在的点这太糟糕了
如果您的规范中没有指定列的数量,那么它要么由您解析的参数的长度提供,要么由您试图放入该位置的元素隐式提供。
这是可行的,因为它定义了一个数组,这正是锯齿状数组所需要的。。。
X[k1][i] = new double[] {Double.parseDouble(temp[i])};
但它只会给你一个有效的二维数组CCD_ 2。
考虑到您使用了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;
}