我需要一个快速容器来存储Java中的对象,这些对象具有(静态)XYZ坐标,并且所有对象都有不同的坐标。基本上是一个网格,但它可能不以 0,0,0 为中心(并且网格中可能缺少部分)。
我尝试使用以整数为键的 map 并对坐标进行位移位,以便为每个坐标创建一个唯一的数字。但当数字高于 255(8 位)时,效果不太好。
此外,数组不能用作键,因为映射实际上并不查看数组的值,而是查看引用。我也可以使用字符串作为键,但每次我想访问一个对象时,我都需要(重新)构建一个字符串。
现在我正在使用 ArrayList 并循环遍历所有键,但这确实很慢。那么存储对象的最快(且内存效率高)的方法是什么?
最佳答案
创建一个自定义类,并使用自定义的 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;
}
}
只需确保您永远不会更改用作键的实例的值。
这并不比使用简单整数差很多。它仍然是有效的恒定时间访问。
关于java - 带 xyz 键的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190074/