2016-07-05 5 views
0

Как мы можем преобразовать 3D-массив в 1D-массив в 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

Какой я ваш вход и ожидаемый выход? Что не так с кодом, который вы пробовали? Ваш вопрос крайне неясен, и ваш пример не может скомпилироваться в его нынешнем виде. –

+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

Nice Java 8 way. Есть ли способ указать другой порядок индексов? – 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]; 
     } 
    } 
} 
Смежные вопросы