繁体   English   中英

将 2D ArrayList 转换为 2D Array

[英]Converting 2D ArrayList to 2D Array

我已经看过几个答案,但我发现的答案有错误。 我正在尝试将 Doubles[] 的 ArrayList 转换为普通的双二维数组。 我的代码:

    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[])

问题

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

解决方案

1.

如果你想要一个真正的Doubles二维ArrayList ,那么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();
}
...

基本上你需要做的就是:

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 它是一个Double数组的ArrayList 看起来您可能正在尝试做的是这样的:

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;"

拆箱时需要小心,并确保正确处理空值。

错误在以下几行:

for (int i = 0; i < ec.size(); i++) {
    ArrayList<Double> row = ec.get(i);
    ei[i] = row.toArray(new double[row.size()]);
}

第一个错误将通过用Double[]替换ArrayList<Double>来解决:

for (int i = 0; i < ec.size(); i++) {
    Double[] row = ec.get(i);
    ei[i] = row.toArray(new double[row.size()]);
}
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 数组的方法相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM