我正在处理一个16x16x16的立方体信息,在每个位置我需要存储一对(int,int)。在大多数用例中,立方体的大部分将保存(0,0),但是每个位置都有可能保存唯一的信息。
可能值得注意的是,(int,int)对中保存的信息之间的唯一关系是它们位于相同的位置。
- 第一个值可能只有0-9,但可以是其他值
- 表示该位置的一个属性。
- 第二个值表示一个模式,它将是0-6或1-6的组合,按升序排列(例如12,123456)
- 描述当前位置与相邻6个位置之间的关系。
- 第二个值在技术上可以是0-64,但为了我的理智,我使用了这种模式。
我目前只是使用一个3d数组,但考虑到大多数数组保持相同的(0,0)值,这似乎是一个很大的浪费。我还应该提到,在保存和安装期间,我不经常访问这些信息。
如果有人有更好的存储结构的建议,我将非常感谢您的输入。
首先想到的是为Cube、pair和3-tuple定义自己的类,类似于以下内容:
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; }
}
和一个类似的类为你的搭档。然后立方体可以是这样的:
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;
}
}
在存储方面,您减少了一些开销,因为您只存储非零对的坐标,并且您可以快速访问hashmap。只创建一个0对,并且您将始终返回这一个引用。
如果您想要更大的可伸缩性,您可以使用泛型类型创建这三个类,以便您可以重用这些结构来存储整数以外的对象。