我们如何在java中将3D数组转换为1D数组?
我使用了以下代码:
input :double [][][]S_p = { { { 1.1, 2.1 }, { 3.2, 4.1 } },
{ { 5.2, 6.1 }, { 7.1, 8.3 } } };
int rows = S_p.length;
int columns = S_p[0].length;
int depth = S_p[0][0].length;
double [] d1 = new double[row*columns*depth];
for(int i=0;i<depth;i++) {
for(int j=0;j<rows;j++){
for(int k=0;k<columns;k++) {
for(int ii=0;ii<rows*columns*depth;ii++) {
d1 [ii] = S_p[ depth *rows *i + columns *k +j];
}
}
}
out put b[]= {1.1, 2.1, 3.2 , 4.1 ...}
但这不起作用
答案 0 :(得分:3)
在Java 8中,您可以执行以下操作:
double[][][] vals = {{{1.1, 2.1}, {3.2, 4.1}}, {{5.2, 6.1}, {7.1, 8.3}}};
double[] test = Arrays.stream(vals)
.flatMap(Arrays::stream)
.flatMapToDouble(Arrays::stream)
.toArray();
System.out.println(Arrays.toString(test));
输出:
[1.1, 2.1, 3.2, 4.1, 5.2, 6.1, 7.1, 8.3]
说明:
Arrays.stream(vals)
创建Stream<double[][]>
。
.flatMap(Arrays::stream)
将其展平为Stream<double[]>
.flatMapToDouble
将Stream<double[]>
展平为DoubleStream
最后.toArray()
收集DoubleStream
中的所有值并返回double[]
。
答案 1 :(得分:1)
您的方法是正确的,但您没有正确地乘以您的坐标。确保你是正确的一个好方法是使用Horner方案的改编:value_x + upper_bound_of_x * (value_y + upper_bound_of_y * ( ... ))
。
此外,最内层循环是多余的,您应该能够使用上述方法计算S_p
的索引。
int rows = S_p.length;
int columns = S_p[0].length;
int depth = S_p[0][0].length;
double[] d1 = new double[rows * columns * depth];
for (int i = 0; i < depth; i++) {
for (int j = 0; j < rows; j++) {
for (int k = 0; k < columns; k++) {
d1[i + depth*(j + rows*(k))] = S_p[j][k][i];
}
}
}