【发布时间】:2020-10-14 23:22:37
【问题描述】:
我有一个名为 Position[] 的对象数组,它返回一个 Position 对象数组。我想将其用作以下哈希图的键:HashMap<Position[],Double> h = new HashMap<>();
我了解即使元素相同,数组也具有不同的哈希码。所以我继续尝试覆盖equals和hashcode。这是我的尝试:
public class Key {
private Position p1;
private Position p2;
public Key(Position p1, Position p2){
this.p1 = p1;
this.p2 = p2
}
@Override
public boolean equals(Object object) {
if (!(object instanceof Key)) {
return false;
}
Key newKey = (Key) object;
return this.hashCode()== newKey.hashCode(); //bit of a hack way
}
@Override
public int hashCode(){
int result = 17;
result = 31 * result + this.p1.hashCode();
result = 31 * result + this.p2.hashCode();
return result;
}
}
所以我不得不将我的地图更改为HashMap<Key,Double> 但是,当我使用键获取值时仍然返回 null。
G2 G4 或 E4 E6 ETC 可以传递给 Key 的构造函数的示例。
我将如何实现这一点,以便比较真正起作用?
谢谢。
【问题讨论】:
-
this.hashCode()== newKey.hashCode()← 那最终会失败。只需使用List<Position>而不是数组。数组没有有用的哈希码,但列表是 guaranteed 以根据其元素的哈希码拥有哈希码。 -
如果不能用
List代替数组,可以使用实用类方法Arrays.hashCode得到正确的hashcode -
@VGR
ArrayList<Position>可能吗?或者必须是List<Position> -
创建 ArrayList 时,可以将其称为 List、Collection、Iterable 或 Object。使变量和字段具有 List 或 Collection 而不是 ArrayList 的类型是一种很好的做法,因为 List 有许多可能的实现(例如 LinkedList 和 Arrays.asList),并且您希望可以选择使用它们。毕竟,你并不需要你的 List 是一个 ArrayList 才能使用它的方法。
-
正确。 Java SE 中的所有 List 实现都已经正确实现了这些方法。
标签: java artificial-intelligence