这是我的孔类
class Hole {
public int a;
public int b;
Hole(int a, int b) {
this.a = a;
this.b = b;
}
所以我添加了一个包含几个孔的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));
当我添加
Hole userInputHole = new Hole(0,1);
System.out.print(leftFlowInnerHole.contain(userInputHole));
总是返回假!!它假设返回true。
我有什么想念?
提前谢谢
答案 0 :(得分:11)
您需要覆盖equals
类中的Object
方法(因此也hashCode
以尊重合同,请参阅Hole
)o==null ? e==null : o.equals(e)
} class。
如果此列表包含指定的元素,则返回true。更多 正式地,当且仅当此列表包含至少一个时才返回true 元素e使得(
equals
)。
基本上,默认==
实现是两个对象之间的public boolean equals(Object obj) {
return (this == obj);
}
比较
this == obj
由于您创建了两个不同的对象,虽然它们与属性具有相同的值,但它们是两个区分对象,因此false
返回Hole a = new Hole(0,1);
leftFlowInnerHole.add(a);
System.out.print(leftFlowInnerHole.contains(a));
。
如果你这样做了:
true
您会看到它输出{{1}}。
答案 1 :(得分:3)
您应该覆盖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;
}
答案 2 :(得分:2)
contains()
方法在检查时检查Object上的equal()
方法。
你必须使用ovveride equals方法才能使其正常工作。
public boolean contains(Object o)
如果此列表包含指定的元素,则返回true。更正式地,当且仅当此列表包含至少一个元素e时返回true,使得(o == null?e == null:o.equals(e))。
Edit:
如果你没有ovveriding equals方法,那么默认的Object equals方法执行,并且,根据Equals方法的文档
类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,此方法返回true,当且仅当x和y引用同一对象时(x == y的值为true)。
所以你的userInputHole == leftFlowInnerHole
总是假的,因为它们指向不同的实例。
因此,为了避免默认实现,你只需要在你的类中等于并提供你的实现。
答案 3 :(得分:0)
这不起作用
if(priceidslist.contains(extraId)){
//Not working
}
我刚刚在(-loop)中添加了此行以检查该条件,然后可以正常工作
String gh = String.valueOf(priceidslist.get(j));
if(gh.equals(extraId)){
rw.put("extraPrice",pricelist.get(j));
}