2

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

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

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

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

4

1 回答 1

3

创建一个自定义类,使用自定义 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;
    }
}

只要确保您永远不会更改您用作键的实例的值。

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

于 2013-03-03T19:53:13.220 回答