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

我有一个方法只能得到我希望传递int[][] double[][] ,在java中有一个简单的方法,就像这样简单:

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

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

没有捷径。

不,这不是正确的打字。 int []是一个类型,double []是一个类型,它们没有关系,所以不允许这样的赋值。 因此,没有办法施展这个。

您将不得不复制元素(您可以在不转换的情况下将int分配给double)。

你可以这样做:

  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的超类或子类时,才有可能。

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

在Java 8中,您可以将int的1维数组转换为double s数组:

 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(); } 

我正准备发布这个答案,但我想发布一些关于每个元素天真地循环多快的指标。 事实certificate它慢了大约10倍 ! 我用10000x1000的零数组测试了它。 我想这是额外的对象创建导致减速。

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

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