2016-07-05 8 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 ...} 

그러나 이것은 당신은 간단하게 할 수있는 Java 8에서

+0

귀하의 의견과 예상 결과는 무엇입니까? 시도한 코드에 어떤 문제가 있습니까? 귀하의 질문은 매우 불분명하며 예제는 그대로 컴파일 할 수 없습니다. –

+0

'rows * columns * depth' 셀이 있습니다. 이렇게 반복 할 필요가 없습니다. 이미 세 개의 첫 번째 for 루프를 사용하여 모든 셀을 탐색 할 수 있습니다. – Aaron

답변

3

작동하지 않습니다 :

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) 마지막 .toArray()DoubleStream의 모든 값을 수집하고 double[]를 반환하는 DoubleStream

Stream<double[]>을 평탄화 Stream<double[]>

.flatMapToDouble로를 평평하게.

+0

좋은 자바 8 방법. 그래도 인덱스의 다른 순서를 지정하는 방법이 있습니까? – majk

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