首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 3D数组:存储立方体,检索立方体的切片

Java 3D数组:存储立方体,检索立方体的切片
EN

Stack Overflow用户
提问于 2013-04-14 03:38:34
回答 2查看 1.6K关注 0票数 2

当使用奇数立方3d数组(3x3x3、5x5x5、7x7x7等)时,返回该数组的2d切片的最有效方法是什么,给定切片的方向轴和用于确定切片沿该轴的相关位置的值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-14 22:00:59

我认为您有三个选项可供选择,这取决于您希望切片方法的输入和输出是什么:

  • 切片在原始的多维数组上工作,产生原始的多维数组,例如:

int[][] ArrayUtils.slice(int[][][] cube, int axis, int sliceIndex)

  • 切片在一个原始的多维数组上工作,产生一个带有getter的对象,例如:

SomeKindOf2DimArrayClass ArrayUtils.slice(int[][][] cube, int axis, int sliceIndex)

  • 切片使用非基元数组作为输入和输出,并且是这样一个类的方法:

SomeKindOf2DimArrayClass slice(int axis, int sliceIndex)

这就是你的界面所关心的。

在实现方面,如果你使用原始数组,那么你没有太多的选择,只能做一些“繁重的工作”--为siice构建一个2d数组--至少对于第三个轴是这样。对于第一个轴,您只需要使用一个2d数组(即result = Arrays.copyOf(cube[sliceIndex]),或者如果您觉得很活泼,甚至可以使用引用);对于第二个轴,您将获得类似于

代码语言:javascript
运行
复制
for(int i=0; i<cube.length; i++) {
    myAllocated2dArray[i] = Arrays.copyOf(cube[i][sliceindex])
}

如果你正在使用一个对象,你有很多的选择,从我刚刚描述的,到@Aquillo在这里的his answer中建议的,再到使用getter方法的原始数组的O(1)-space包装器。

通过阅读C language FAQs中关于类似问题的答案,您可能会从已经提出的两个实现中获得一些灵感,其中指针(引用)的使用是明确的:

How can I use statically- and dynamically-allocated multidimensional arrays interchangeably when passing them to functions?

票数 1
EN

Stack Overflow用户

发布于 2013-04-14 16:52:06

因为这对我来说是一个很有趣的话题,所以我也一直在寻找答案。我想你可能对Mark Byers的方法感到幸运。

Mark在如何使用一维数组方面有一个非常好的方法,而不是将其存储在3D数组中。

经过一些尝试,我已经想出了完整的立方体,希望这适合你:

代码语言:javascript
运行
复制
public class Cube {
    int w, h, d;
    int[] cube;

    public Cube(int w, int h, int d) {
        this.w = w;
        this.h = h;
        this.d = d;
        System.out.println("cube: w" + w + ", h" + h + ", d" + d + " = " + (w * h * d));
        cube = new int[w * h * d];
    }

    int getCubeValue(int x, int y, int z) {
        return cube[x * h * d + y * d + z];
    }

    void setCubeValue(int x, int y, int z, int value) {
        System.out.println("value " + (x * h * d + y * d + z) + ": x" + x + ", y" + y + ", z" + z + " = " + value);
        cube[x * h * d + y * d + z] = value;
    }

    int[] xSlice(int x) {
        int[] slice = new int[h * d];
        for(int y = 0; y < h; y++) {
                for(int z = 0; z < d; z++) {
                        slice[y * d + z] = getCubeValue(x, y, z);
                }
        }
        return slice;
    }

    int xSliceValue(int[] slice, int y, int z) {
        return slice[y * d + z];
    }

    int[] ySlice(int y) {
        int[] slice = new int[d * w];
        for(int z = 0; z < d; z++) {
                for(int x = 0; x < w; x++) {
                        slice[z * w + x] = getCubeValue(x, y, z);
                }
        }
        return slice;
    }

    int ySliceValue(int[] slice, int x, int z) {
        return slice[z * w + x];
    }

    int[] zSlice(int z) {
        int[] slice = new int[w * h];
        for(int x = 0; x < w; x++) {
            for(int y = 0; y < h; y++) {
                slice[x * h + y] = getCubeValue(x, y, z);
            }
        }
        return slice;
    }

    int zSliceValue(int[] slice, int x, int y) {
        return slice[x * h + y];
    }
}

假设你创建了一个像这样的new Cube(3, 3, 3)立方体,最后一个值将可以被cube.getCubeValue(2, 2, 2)接近,因为它从零开始。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15992076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档