将3D阵列展平为1D阵列

时间:2016-07-05 13:21:28

标签: java arrays

我们如何在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 ...}

但这不起作用

2 个答案:

答案 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[]>

.flatMapToDoubleStream<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];
        }
    }
}