Java 将三维阵列展平为一维阵列

Java 将三维阵列展平为一维阵列,java,arrays,Java,Arrays,如何在java中将3D数组转换为一维数组 我使用了下面的代码: 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*colu

如何在java中将3D数组转换为一维数组

我使用了下面的代码:

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 ...}
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]。长度;
int depth=S_p[0][0]。长度;
double[]d1=新的双精度[行*列*深度];

对于Java 8中的(inti=0;i),您只需执行以下操作:

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(VAL)
创建

.flatMap(Arrays::stream)
将其展平为

.flatMapToDouble
展平为
双流


最后,
.toArray()
收集
DoubleStream
中的所有值,并返回一个
double[]

在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(VAL)
创建

.flatMap(Arrays::stream)
将其展平为

.flatMapToDouble
展平为
双流


最后,
.toArray()
收集
双流
中的所有值,并返回一个
double[]
您的方法是正确的,但是您没有正确地乘以坐标。确保正确的一个好方法是使用Horner方案的自适应:
value_x+上限_x*(y值+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];
        }
    }
}
int rows=S\u p.length;
int columns=S_p[0]。长度;
int depth=S_p[0][0]。长度;
double[]d1=新的双精度[行*列*深度];
for(int i=0;i
您的方法是正确的,但是您没有正确地乘以坐标。确保正确的一个好方法是使用霍纳方案的改编:
值x+上界x*(值y+上界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];
        }
    }
}
int rows=S\u p.length;
int columns=S_p[0]。长度;
int depth=S_p[0][0]。长度;
double[]d1=新的双精度[行*列*深度];
for(int i=0;i
你的输入和预期输出是什么?你尝试的代码有什么问题吗?你的问题非常不清楚,你的示例无法按原样编译。你有
行*列*深度
单元格。没有必要进行如此深入的迭代,你已经用前三个
浏览了所有单元格以查找
循环。你的输入是什么预期的输出是什么?您尝试的代码有什么问题?您的问题非常不清楚,您的示例无法按原样编译。您有
行*列*深度
单元格。没有必要进行如此深入的迭代,您已经用前三个
for
循环浏览了所有单元格。Java 8方法不错。有没有办法但是,指定不同的索引顺序?很好的Java 8方法。但是,有没有一种方法可以指定不同的索引顺序?