我有一个仅接受 double[][]
参数的方法,我想传递 int[][]
,在Java中是否有简单的方法可以做到这一点,就像这样简单:
int [][] iArray = {
{ 1, 2, },
{ 5, 6, }
};
double [][] dArray = (double[][]) iArray ; ???
double [] []
数组中。嗯,我的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循环以获取可变数量的列。
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];
}
}
你不能将它们强制转换,double类型在内存中的布局与int类型不同,这不仅仅是改变名称的问题。
编辑:只有当double是int的超类或子类时,才可能实现强制转换。