关于如何存储和使用多维数据的建议?

Suggestions for how to store and work with multidimensional data?

我正在处理一个 16x16x16 的信息立方体,在每个位置我都需要存储一对(int,int)。在大多数用例中,立方体的大部分将包含 (0,0),但每个位置都有可能包含唯一信息。

可能值得注意的是,pair(int,int) 中保存的信息之间的唯一关系是它们处于相同的位置。

  1. 第一个值可能仅为 0-9,但可以是其他值
    • 表示该位置的属性。
  2. 第二个值表示一个模式,它将是 0-6 或 1-6 的升序组合(例如 12、123456)
    • 它描述了当前位置与相邻6个位置之间的关系。
    • 第二个值在技术上可以只是 0-64,但为了我在使用它时的理智,我使用了那个模式。

我目前只使用 3d 数组,但考虑到数组的大部分都具有相同的 (0,0) 值,这似乎是一种巨大的浪费。我还应该提到,在保存之外和设置期间,我不会经常访问此信息。

如果有人对更好的存储结构有建议,我将不胜感激。

首先想到的是为立方体、对和三元组定义自己的 classes,如下所示:

public class IntTuple {

    private final int x;
    private final int y;
    private final int z;

    public Tuple(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public int getX() { return x; }
    public int getY() { return y; }
    public int getZ() { return z; }
}

还有一对类似的 class。然后立方体可以是这样的:

public class Cube {

    private HashMap<IntTuple, IntPair> cubeMap = new HashMap<IntTuple, IntPair>();
    private zeroPair = new IntPair(0, 0);

    public addPair(IntTuple coords, IntPair pair) {
        cubeMap.put(coords, pair);
    }

    public IntPair getPair(IntTuple coords) {
        if (cubeMap.containsKey(coords))
            return cubeMap.get(coords);
        else
            return zeroPair;
    }
}

在存储方面,您减少了一些开销,因为您只存储具有非零对的坐标,并且您可以使用散列图进行快速访问。仅创建一个零对,您将始终 return 那个参考。

如果您想要更大的可伸缩性,可以使所有三个 class 都具有通用类型,这样您就可以重新使用结构来存储整数以外的对象。