2016-07-05 90 views
0

我们如何将3D数组转换为Java中的1D数组?将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

我的输入和预期输出是什么?你试过的代码有什么问题?你的问题是非常不清楚的,你的例子不能像现在这样编译。 –

+0

你有'rows * columns * depth'单元格。没有必要迭代太深,你已经用三个第一个for循环来浏览所有单元。 – Aaron

回答

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

+0

不错的Java 8路。有没有办法指定不同的索引顺序? – majk

1

你的方法是正确的,但你没有正确地乘坐你的坐标。确保你正确的一个好方法是使用霍纳方案的改编: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]; 
     } 
    } 
}