Java ArrayList包含始终返回false,尽管它包含相同的值

时间:2013-12-31 15:47:29

标签: java arraylist contain

这是我的孔类

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 个答案:

答案 0 :(得分:11)

您需要覆盖equals类中的Object方法(因此也hashCode以尊重合同,请参阅Holeo==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总是假的,因为它们指向不同的实例。

因此,为了避免默认实现,你只需要在你的类中等于并提供你的实现。

An efficient equals(Object o) implementation

答案 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));
                           }