将2D ArrayList转换为2D阵列

时间:2015-07-20 17:14:09

标签: java arrays arraylist

我已经看过几个答案了,我发现我得到的答案出错了。我正在尝试将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 [])

4 个答案:

答案 0 :(得分:2)

问题

  
      
  1. 首先,此处的ec类型为ArrayList<Double[]>,这意味着ec.get(i)应该返回Double[]而不是ArrayList<Double>
  2.   
  3. 其次,doubleDouble是完全不同的类型。您不能在代码上使用row.toArray(new double[row.size()])
  4.   

解决方案

1。

如果您想要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;
}

2

但如果你坚持使用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;
}

3

最后,如果您可以将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;它是ArrayListDouble数组。看起来你可能会尝试做的事情是这样的:

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数组的相同方法。