将二维整型数组转换为二维双精度浮点型数组的最简方法

4

我有一个仅接受 double[][] 参数的方法,我想传递 int[][],在Java中是否有简单的方法可以做到这一点,就像这样简单:

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

18
很遗憾,将您的数组转型的唯一方法是逐个迭代每个元素并将它们一个个转型后重新插入到新的double [] []数组中。
没有捷径。

4
好的,我的资料来源是我自己对这个主题的研究。 ;) 在谷歌搜索周围的话会得出相同的结论。 - dee-see

2

嗯,我的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], []]

2
不,那不是正确的输入。int[]是一种类型,double[]也是一种类型,它们之间没有关系,因此不允许这样的赋值。因此,无法进行强制转换。
您将不得不复制元素(您可以将int分配给double而无需进行强制转换)。

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)”。 @Andreas;是的。 - Martin

0
在Java 8中,您可以将一个一维的int数组转换为一个double数组:
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];
    }
}

0

你不能将它们强制转换,double类型在内存中的布局与int类型不同,这不仅仅是改变名称的问题。

编辑:只有当double是int的超类或子类时,才可能实现强制转换。


那不是一个非常有帮助的答案。即使它们布局相同(即都是32位),你仍然无法将它们强制转换。Java类型系统根本不允许这样做。 - Jochen
我想表达的是,一个不是另一个的子类,所以强制转换没有意义。它们都是32位并不意味着它们的布局相同。但我理解你的观点。 - Sandro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接