我是新来Java。我正在写一个二维游戏,我决定使用哈希地图来存储我的地图数据,因为我需要支持我的地图坐标的负索引。这是因为地图的大小可以在游戏过程中增长。
我编写了一个自定义Pair类,用于存储最终的x和y值。我使用这个Pair对象作为我的HashMap的密钥。我的值是自定义Cell类的实例。
我已经声明我的HashMap如下:
HashMap
接下来,我使用以下方法将条目添加到地图:
tiles。put(新对(0,0),新单元())
0,0显然是这个单元唯一的x,y坐标。
如何使用访问单元格的字段和方法。HashMap的get()方法,特定于单个对?例如对(0,0)或对(0,1)。如果键只是一个字符串或int,我就不会有问题了。我就是不知道如何为具有特定坐标的对象设置键的格式。
您将需要为您的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));
您只需编写tiles。获取(新的一对(0,0))
,就像对put所做的一样。
您需要重写Pair
类的equals
和hashCode
方法。现在,如果您有两个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继承的对象(即任何对象)。