当前位置: 首页 > 知识库问答 >
问题:

使用自定义Pair Object作为键访问HashMap值

柳经纶
2023-03-14

我是新来Java。我正在写一个二维游戏,我决定使用哈希地图来存储我的地图数据,因为我需要支持我的地图坐标的负索引。这是因为地图的大小可以在游戏过程中增长。

我编写了一个自定义Pair类,用于存储最终的x和y值。我使用这个Pair对象作为我的HashMap的密钥。我的值是自定义Cell类的实例。

我已经声明我的HashMap如下:

HashMap

接下来,我使用以下方法将条目添加到地图:

tiles。put(新对(0,0),新单元())

0,0显然是这个单元唯一的x,y坐标。

如何使用访问单元格的字段和方法。HashMap的get()方法,特定于单个对?例如对(0,0)或对(0,1)。如果键只是一个字符串或int,我就不会有问题了。我就是不知道如何为具有特定坐标的对象设置键的格式。


共有3个答案

孙明德
2023-03-14

您将需要为您的Pair()类型重写方法. equals(). hashCode()。需要它们才能在HashMap中使用类型。Equals可以检查2个值是否相等:

@Override public boolean equals(Object o) {
    if(this == o) return true;
    if(!(o instanceof Pair)) return false;
    Pair p = (Pair)o;
    return p.x == x && p.y == y;
}

对于hashCode,必须生成唯一的值:

private volatile int hashCode; // define this as a member of the class

@Override public int hashCode() {
    int result = hashCode;
    if(result == 0) {
        result = 17 * x + 31 * y;
        hashCode = result;
    }
    return result;
}

然后您可以通过简单的调用访问(0,0)的单元格

tiles.get(new Pair(0, 0));
逄嘉木
2023-03-14

您只需编写tiles。获取(新的一对(0,0)),就像对put所做的一样。

杨研
2023-03-14

您需要重写Pair类的equalshashCode方法。现在,如果您有两个Pair实例:

Pair p1 = new Pair(0,0);
Pair p2 = new Pair(0,0);

程序中的这两个实例将不被视为相等的,因此如果您说:

tiles.put(p1, XXX);
tiles.put(p2, YYY);

其行为是这样的,您的映射将有两个不同的键,具有两个不同的值-我相信您想要的是一个键,在这些语句执行之后具有最后一个值YYY。

在实现hashCode和equals之后,您可以编写一个静态的helper方法,用给定的坐标实例化一个新的Pair,并执行映射查找:

static Cell lookup(int x, int y) {
    return tiles.get(new Pair(x, y));
}

下面是一个帮助您入门的基本结对课程:

public class Pair {

    private final int x;
    private final int y;

    public Pair(final int x, final int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Pair)) {
            return false;
        }

        final Pair pair = (Pair) o;

        if (x != pair.x) {
            return false;
        }
        if (y != pair.y) {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode() {
        int result = x;
        result = 31 * result + y;
        return result;
    }
}
 类似资料:
  • 问题内容: 我认为我的问题很简单,但是我找不到解决方案,所以我决定在这里提问。我需要做的是使用这样的自定义键类型: 但是,我在这里丢失了一些东西,因为停止功能正常。首先,密钥不是唯一的,并且可以在中找到具有相同值的Pair的不同实例。同样,包含键功能不能像我想象的那样起作用:)。 我显然错过了一些东西,并且更有可能应该以某种方式定义一种比较类中实例的方法。但是我在课堂上尝试实现Comparable

  • 问题内容: 工具:Reactjs 0.14.0 Vanilla Flux 我需要唯一标识符的原因有两个: 儿童和解 跟踪点击了哪个孩子 因此,假设我有一个看起来像这样的消息列表: 现在,我使用“ Array.prototype.map()” 在所有者组件内部创建“ ownee” 组件() 但是this.props.key在MessageListItem中是未定义的,即使我知道在传递时已定义的事实也

  • 我正试图从Java代码生成Swagger文档,我的嵌套模型属性之一是HashMap。生成的示例如下所示: 我需要它看起来像是: 换句话说,我需要告诉他们additionalProp字符串应该是什么,最好不要重复三次。有没有办法用夸张的注释来做到这一点?我不想硬编码一个完整的例子,因为CustomObject本身有很多属性,而且仍然在不断变化。有没有可能按照 (除了真正有效的东西)? 我尝试过以这种

  • 问题内容: 我有以下代码,其中我使用HashMap(使用两个并行数组)存储键值对(键可以具有多个值)。现在,我必须存储和加载它以备将来使用,这就是为什么我使用文件通道存储和加载它的原因。此代码的问题是:我可以在我的8 GB服务器中存储近1.2亿个键值对(实际上,我可以为JVM分配8 GB中的近5 GB,而这两个并行阵列需要近2.5 GB,其他内存用于我的代码的各种处理)。但是,我必须存储近600/

  • 问题内容: 我使用布尔数组作为HashMap的键。但是问题是,尽管元素相同,但当将另一个数组作为键传递时,HashMap无法获取键。(因为它们是不同的对象)。 如何使其与数组作为键一起使用?这是代码: 这两个数组和都包含相同的元素,但是HashMap不会为返回任何内容。 我该如何运作? 问题答案: 您无法以这种方式这样做。都和将有不同的值,因为该方法是从继承,它使用参考来计算哈希码(默认实现)。因

  • 问题内容: 我试图建立一个HashMap,它将具有整数作为键和对象作为值。 我的语法是: 但是,返回的错误是-令牌“ int”的语法错误,此令牌后应包含尺寸-我不明白为什么应该添加尺寸(即:将int制成数组),因为我只需要存储一个数字作为关键。 我能做什么? 提前致谢!:) 问题答案: 您不能使用基元,因为HashMap在内部将对象用作键。因此,您只能使用从Object继承的对象(即任何对象)。