带xyz键的容器

时间:2013-03-03 19:50:24

标签: java containers

我需要一个快速容器来存储Java中的对象,这些对象具有(静态)XYZ坐标,并且所有对象具有不同的坐标。基本上是网格,但它可能不以0,0,0为中心(并且网格中可能缺少部分)。

我尝试使用带有整数的Map作为键并对位移进行位移,以便为每个坐标创建唯一的数字。但是当数字高于255(8位)时,这并没有太好用。

此外,数组不能作为键,因为映射实际上不会查看数组的值,而是查看引用。我也可以使用String作为键,但每次我想访问一个对象时,我都需要(重新)构建一个String。

现在我正在使用ArrayList并循环遍历所有键,但这确实很慢。那么存储对象的最快(和内存效率)方式是什么?

1 个答案:

答案 0 :(得分:2)

创建一个自定义类,使用自定义hashCode()和equals()方法作为键。

public static class Vertex {
    public int x, y, z;
    public boolean equals(Object o){
        if(this == o) return true;
        if(!(o instanceof Vertex)) return false;
        Vertex v = (Vertex)o;
        return x == v.x && y == v.y && z == v.z;
    }

    public int hashCode(){
        //  Use whatever prime numbers you like
        return x ^ y * 137 ^ z * 11317;
    }
}

请确保永远不会更改您用作密钥的实例的值。

这并不比使用简单整数差。它仍然是有效的恒定时间访问。