Sha*_*kus 9 java arraylist contain
这是我的孔类
class Hole {
public int a;
public int b;
Hole(int a, int b) {
this.a = a;
this.b = b;
}
Run Code Online (Sandbox Code Playgroud)
所以我添加了一个包含几个洞的ArrayList
public void checkPathLoop(int x, int y) {
//rough code
ArrayList<Hole> leftFlowInnerHole = new ArrayList<>();
//left holes rules
leftFlowInnerHole.add(new Hole(0, 1));
leftFlowInnerHole.add(new Hole(1, 5));
leftFlowInnerHole.add(new Hole(5, 4));
leftFlowInnerHole.add(new Hole(0, 4));
Run Code Online (Sandbox Code Playgroud)
当我添加
Hole userInputHole = new Hole(0,1);
System.out.print(leftFlowInnerHole.contain(userInputHole));
Run Code Online (Sandbox Code Playgroud)
它总是返回假!! 它假设返回true.
有什么我想念的吗?
先感谢您
Ale*_* C. 11
你需要覆盖类中的equalsherited方法Object(因此也要hashCode尊重契约,请参阅为什么我需要覆盖Java中的equals和hashCode方法?)Hole.
如果此列表包含指定的元素,则返回true.更正式地说,当且仅当此列表包含至少一个元素e(
o==null ? e==null : o.equals(e))时才返回true .
基本上,默认equals实现是==两个对象之间的比较
public boolean equals(Object obj) {
return (this == obj);
}
Run Code Online (Sandbox Code Playgroud)
由于您创建了两个不同的对象,虽然它们具有与属性相同的值,但它们是两个区分对象并因此this == obj返回false.
如果你这样做:
Hole a = new Hole(0,1);
leftFlowInnerHole.add(a);
System.out.print(leftFlowInnerHole.contains(a));
Run Code Online (Sandbox Code Playgroud)
你会看到它输出true.
您应该覆盖 Hole 类的 equals 方法:
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Hole)) {
return false;
}
Hole other = (Hole) obj;
return a == other.a && b == other.b;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15834 次 |
| 最近记录: |