我已经看过几个答案了,我发现我得到的答案出错了。我正在尝试将Doubles []的ArrayList转换为普通的双2D数组。我的代码:
public ArrayList<Double[]> ec;
public double[][] ei;
...
encogCorpus = new ArrayList<Double[]>();
...
ec.add(inputs);
...
ei = new double[ec.size()][];
for (int i = 0; i < ec.size(); i++) {
ArrayList<Double> row = ec.get(i);
ei[i] = row.toArray(new double[row.size()]);
}
我收到的错误是
类型不匹配:无法从Double []转换为ArrayList
并且
ArrayList类型中的toArray(T [])方法不适用于参数(double [])
答案 0 :(得分:2)
- 首先,此处的
ec
类型为ArrayList<Double[]>
,这意味着ec.get(i)
应该返回Double[]
而不是ArrayList<Double>
。- 其次,
醇>double
和Double
是完全不同的类型。您不能在代码上使用row.toArray(new double[row.size()])
。
如果您想要ArrayList
的真实2D Doubles
,则ec
的类型应为ArrayList<ArrayList<Double>>
。但是因为我们无法使用toArray()
,所以我们手动循环。
public ArrayList<ArrayList<Double>> ec; // line changed here
public double[][] ei;
...
encogCorpus = new ArrayList<ArrayList<Double>>(); // and here also
...
ec.add(inputs); // `inputs` here should be of type `ArrayList<Double>`
...
ei = new double[ec.size()][];
for (int i = 0; i < ec.size(); i++) {
ArrayList<Double> row = ec.get(i);
// Perform equivalent `toArray` operation
double[] copy = new double[row.size()];
for (int j = 0; j < row.size(); j++) {
// Manually loop and set individually
copy[j] = row.get(j);
}
ei[i] = copy;
}
但如果你坚持使用ArrayList<Double[]>
,我们只需要改变主要部分:
public ArrayList<Double[]> ec;
public double[][] ei;
...
encogCorpus = new ArrayList<Double[]>();
...
ec.add(inputs);
...
ei = new double[ec.size()][];
for (int i = 0; i < ec.size(); i++) {
// Changes are only below here
Double[] row = ec.get(i);
double[] copy = new double[row.length];
// Still, manually loop...
for (int j = 0; j < row.length; j++) {
copy[j] = row[j];
}
ei[i] = copy;
}
最后,如果您可以将Double[]
更改为double[]
,则解决方案 2 会变为,
public ArrayList<double[]> ec; // Changed type
public double[][] ei;
...
...
for (int i = 0; i < ec.size(); i++) {
// Simpler changes here
ei[i] = ec.get(i).clone();
}
...
答案 1 :(得分:2)
基本上你需要做的就是:
for (int i = 0; i < ec.size(); i++) {
Double[] boxedRow = ec.get(i);
double[] unboxedRow = new double[boxedRow.length];
for (int j = 0; j < boxedRow.length; j++)
unboxedRow[j] = boxedRow[j];
ei[i] = unboxedRow;
}
你因拳击/拆箱而遇到麻烦。手动将Doubles
取消装箱到doubles
允许我们将数组转换为正确的类型。
另一种解决方案是:
public ArrayList<Double[]> ec;
public Double[][] ei; // no need to unbox
// ...
for (int i = 0; i < ec.size(); i++) {
ei[i] = ec.get(i);
}
我要补充一点,您当前的解决方案不是2D ArrayList
;它是ArrayList
个Double
数组。看起来你可能会尝试做的事情是这样的:
public ArrayList<ArrayList<Double>> ec;
public double[][] ei;
// ...
for (int i = 0; i < ec.size(); i++) {
ArrayList<Double> row = ec.get(i);
Double[] rowArray = row.toArray(new Double[row.size()]);
double[] unboxedRow = new double[rowArray.length];
for (int j = 0; j < rowArray.length; j++)
unboxedRow[j] = rowArray[j];
ei[i] = unboxedRow;
}
再次,可能是这样:
public ArrayList<ArrayList<Double>> ec;
public Double[][] ei;
// ...
for (int i = 0; i < ec.size(); i++) {
ArrayList<Double> row = ec.get(i);
ei[i] = row.toArray(new Double[row.size()]);
}
最后,请注意,当您实例化新Double[]
时,数组会初始化为null
而不会至0
。如果您尝试以下操作,您将获得NullPointerException
,但它会编译。
Double[] boxedArray = new Double[1];
double unboxed = boxedArray[0]; // equiv to "double unboxed = null;"
取消装箱时需要小心,并确保正确处理空值。
答案 2 :(得分:0)
错误如下:
for (int i = 0; i < ec.size(); i++) {
ArrayList<Double> row = ec.get(i);
ei[i] = row.toArray(new double[row.size()]);
}
将ArrayList<Double>
替换为Double[]
:
for (int i = 0; i < ec.size(); i++) {
Double[] row = ec.get(i);
ei[i] = row.toArray(new double[row.size()]);
}
答案 3 :(得分:0)
List<double[]> list = Arrays.asList(new double[]{1.1, 2.0}, new double[]{3.0, 5.8});
double[][] res = list.toArray(new double[list.size()][]);
// System.out.println(Arrays.deepToString(res));
将ArrayList转换为2d int数组的相同方法。