Java 如何将一维阵列转换为三维阵列?

Java 如何将一维阵列转换为三维阵列?,java,arrays,Java,Arrays,我有一个由4096(16^3)字节组成的文本文件,需要加载并放入3D数组。每个字节代表16^3块中的一个磁贴ID,那么如何基于长度、宽度和深度为16的1D数组创建3D数组呢?我知道算法是这样的: i = x + WIDTH * (y + HEIGHT * z); z = Math.round(i / (WIDTH * HEIGHT)); y = Math.round((i - z * WIDTH * HEIGHT) / WIDTH); x = i - WIDTH * (y + HEIGHT

我有一个由4096(16^3)字节组成的文本文件,需要加载并放入3D数组。每个字节代表16^3块中的一个磁贴ID,那么如何基于长度、宽度和深度为16的1D数组创建3D数组呢?我知道算法是这样的:

i = x + WIDTH * (y + HEIGHT * z);


z = Math.round(i / (WIDTH * HEIGHT));
y = Math.round((i - z * WIDTH * HEIGHT) / WIDTH);
x = i - WIDTH * (y + HEIGHT * z);
byte[] data = ... // Read 4096 bytes
byte[][][] res = new byte[16][16][16];
for (int x = 0 ; x != 16 ; x++) {
    for (int y = 0 ; y != 16 ; y++) {
        for (int z = 0 ; z != 16 ; z++) {
            res[x][y][z] = data[16*16*x + 16*y + z];
        }
    }
}

我怎么能找到我呢?我不明白,因为在计算x、y和z变量时,I是一个变量。

可以使用三个嵌套循环来完成。使用您给出的第一个公式,从一组
x
y
z
到1D数组中的相应索引,如下所示:

i = x + WIDTH * (y + HEIGHT * z);


z = Math.round(i / (WIDTH * HEIGHT));
y = Math.round((i - z * WIDTH * HEIGHT) / WIDTH);
x = i - WIDTH * (y + HEIGHT * z);
byte[] data = ... // Read 4096 bytes
byte[][][] res = new byte[16][16][16];
for (int x = 0 ; x != 16 ; x++) {
    for (int y = 0 ; y != 16 ; y++) {
        for (int z = 0 ; z != 16 ; z++) {
            res[x][y][z] = data[16*16*x + 16*y + z];
        }
    }
}
根据数据的组织方式(例如,按层、按行、按列、按列、按层、按行、按行、按列、按层等),您可能需要切换
x
y
的顺序,和
z
计算
数据数组中的索引。

试试这个

    byte[][][] a = new byte[16][16][16];
    InputStream is = new FileInputStream("file");
    for(int i = 0; i < 16; i++) {
        for(int j = 0; j < 16; j++) {
            is.read(a[i][j]);
        }
    }
byte[]a=新字节[16][16][16];
InputStream is=新文件InputStream(“文件”);
对于(int i=0;i<16;i++){
对于(int j=0;j<16;j++){
现改为(a[i][j]);
}
}

请参见

这是如何工作的?这就是所谓的锯齿阵列吗?我不完全明白这是怎么回事![]表示3-D阵列。不,我理解。但是for循环中的最后一行是.read(a[i][j]),创建三维数组时只使用二维。这是为什么?因为[i][j]是实际的数组字节[16],所以InputStream使用读入数组读取(字节[])对不起,我不认为这比我接受的答案更有益(更不用说我真的不认为我明白了…),我只是不明白如何使用3D数组而只使用二维。