10

这是我的洞课

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。

有什么我想念的吗?

先感谢您

4

4 回答 4

14

您需要在您的类中覆盖equalsObject类继承的方法(因此也要hashCode遵守合同,请参阅为什么我需要覆盖 Java 中的 equals 和 hashCode 方法?Hole

如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个满足 ( o==null ? e==null : o.equals(e)) 的元素 e 时,才返回 true。

基本上默认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.

于 2013-12-31T15:48:47.647 回答
5

您应该覆盖 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;
}
于 2013-12-31T16:09:55.500 回答
2

contains()方法equal()在检查时检查 Object 上的方法。

您必须 ovveride equals 方法才能使其工作。

public boolean contains(Object o)

如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e 满足(o==null ? e==null : o.equals(e)) 时,才返回 true。

Edit:

如果您不使用 equals 方法,则执行默认的 Object equals 方法,并且根据 Equals 方法的文档

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true。

所以你userInputHole == leftFlowInnerHole总是错误的,因为它们指向不同的实例。

因此,为了避免默认实现,您只需在您的类中覆盖 equals 并提供您的实现。

一个高效的 equals(Object o) 实现

于 2013-12-31T15:48:45.017 回答
0

这是行不通的

   if(priceidslist.contains(extraId)){
                               //Not working 
                            }

我刚刚添加了这些行来检查(for -loop)中的条件,然后它工作正常

  String gh = String.valueOf(priceidslist.get(j));
                           if(gh.equals(extraId)){
                               rw.put("extraPrice",pricelist.get(j));
                           }
于 2019-03-26T09:32:14.213 回答