将2d int数组强制转换为2d double的最短方法



我有一个只获取double[][]的方法,我想将int[][]传递给它,在java中有没有一个简单的方法可以做到这一点,比如:

int [][] iArray = {
          { 1, 2, },
          { 5, 6, }
        };
double [][] dArray = (double[][]) iArray ; ???

不幸的是,强制转换数组的唯一方法是遍历每个元素,并在重新插入新的double[][]数组时逐个强制转换它们。

没有捷径可走。

不,这是不正确的键入。int[]是一个类型,double[]是一种类型,它们没有关系,所以不允许这样的赋值。因此,没有办法铸造这个。

您将不得不复制元素(您可以在不强制转换的情况下为double赋值int)。

嗯,我用Java 8编写的代码值得被称为快捷方式吗?

import java.util.Arrays;
// ...
/// Cast!
int[][] int2DArray = {{3, 1}, {3, 3, 7}, {}};
Object[] arrayOfUntypedArraies = Arrays.stream(int2DArray).map(intArray -> Arrays.stream(intArray).asDoubleStream().toArray()).toArray();
double[][] double2DArray = Arrays.copyOf(arrayOfUntypedArraies, arrayOfUntypedArraies.length, double[][].class);
/// Print!
System.out.println(Arrays.deepToString(int2DArray));
// [[1, 2], [5, 6, 7], []]
System.out.println(Arrays.deepToString(double2DArray));
// [[1.0, 2.0], [5.0, 6.0, 7.0], []]

你可以这样做:

    int[][] intarray = {{1, 2}, {5, 6}};
    double[][] doublearray = new double[intarray.length][intarray[0].length];
    for(int i = 0; i < intarray.length; i++)
    {
        for(int j = 0; j < intarray[0].length; j++)
            doublearray[i][j] = (double) intarray[i][j];
    }

编辑:正如Andreas_D所指出的,只有当所有行的长度都相同时,这才有效,如果你想要可变的长度,你必须遍历第二个for循环,以获得可变数量的列。

您不能强制转换它们,double在内存中的布局与int不同,这不是简单地更改它们的名称。

EDIT:只有当double是int的超类或子类时,才有可能

在Java 8中,您可以将ints的一维数组转换为doubles的数组:

double[] singleDimensionDoubleArray = 
        Arrays.stream(singleDimensionIntArray).asDoubleStream().toArray()

因此,我写了一个我认为会更快的版本,通过在行上循环:

int[][] iArray = {
    {1, 2,},
    {5, 6,}
};
double[][] dArray = new double[iArray.length][];
for (int row = 0; row < iArray.length; row++) {
    dArray[row] = Arrays.stream(iArray[row]).asDoubleStream().toArray();
}

我正要发布这个答案,但我想我应该发布一些指标,说明天真地在每个元素上循环的速度有多快。原来它大约慢了10倍!我用10000x1000个零数组进行了测试。我想是额外的对象创建导致了速度减慢。

除非其他人能证明不是这样,否则我认为最简单的解决方案实际上是最快的:

for (int row = 0; row < iArray.length; row++) {
    for (int column = 0; column < iArray[0].length; column++) {
        dArray[row][column] = (double) iArray[row][column];
    }
}

最新更新