java - 带 xyz 键的容器

标签 java containers

我需要一个快速容器来存储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/

相关文章:

java - 为什么 jGit 的 RevWalk.reset() 方法行为异常?

HTML 960gs - 页脚消失

java - 以下循环的(最坏情况)时间分析是什么?

java - Double 小于零的双重转换

java - 如何在 Android 上的可访问文件夹中创建文件? (非根)

linux - 在没有容器的情况下运行容器的 ELF 文件

html - CSS 和 HTML 拆分容器

c++ - 如何使用 boost lambda 用新对象填充指针 vector

docker - 如何保持无限循环运行以不关闭Docker中的容器

java - libgdx 离开屏幕和屏幕生命周期