ArrayList的自定义Contains方法

时间:2011-11-30 06:46:38

标签: java arraylist contains

我有一些对象

class A {
  private Long id; 
  private String name; 
  public boolean equals(Long v) {
     return this.id.equals(v);
  }
}

和这些对象的ArrayList。 我想要的是能够检查该列表是否包含一个按对象的字段的对象。 例如:

ArrayList<A> list = new ArrayList<A>(); if (list.contains(0L)) {...}

但是压倒的Equals方法对我没有帮助。我做错了什么? 谢谢

更新 我应该覆盖hashcode()方法吗?

3 个答案:

答案 0 :(得分:47)

这里有一些代码可能会证明它是如何工作的:

import java.util.ArrayList;

class A {
  private Long id; 
  private String name; 

  A(Long id){
      this.id = id;
  }

    @Override
  public boolean equals(Object v) {
        boolean retVal = false;

        if (v instanceof A){
            A ptr = (A) v;
            retVal = ptr.id.longValue() == this.id;
        }

     return retVal;
  }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }
}

public class ArrayList_recap {
    public static void main(String[] args) {
        ArrayList<A> list = new ArrayList<A>(); 

        list.add(new A(0L));
        list.add(new A(1L));

        if (list.contains(new A(0L)))
        {
            System.out.println("Equal");
        }
        else
        {
            System.out.println("Nah.");
        }    
    }

}

首先,重写equals(Object o)方法。然后还有hashCode()的覆盖。另请注意,检查等号的实例将确保您不会尝试比较不同的对象。

应该这样做!希望它有所帮助!干杯:)

答案 1 :(得分:8)

您没有覆盖班级中的方法。为了覆盖,方法参数也必须是相同的类型。

应该是

public boolean equals(Object o) {

}

在你的情况下,它是

public boolean equals(Long o) {

 }

你可能需要这样做

public boolean equals(Object o)
    {
        if (o == null) return false;
        if (o == this) return true; //if both pointing towards same object on heap

            A a = (A) o;
        return this.id.equals(a.id);
    }

答案 2 :(得分:7)

  

我做错了什么?

你没有压倒一切。你正在超载。

contains方法使用签名equals调用equals(Object)方法,因此您添加的此(新)方法不会被调用。

另一个问题是您的equals方法对contains的语义错误。 contains方法需要将this与可能是列表成员的对象进行比较。您的列表不包含Long个对象。它包含A类型的对象。

现在你可以逃避这个...如果你使用原始列表类型......但你要做的是违反API合同和不良做法。更好的解决方案是明确地迭代和测试列表的元素。


  

我是否应该覆盖hashcode()方法呢?

如果覆盖equals(Object),那么您还应该覆盖hashcode()

这里没有任何区别,但是如果你将A个对象放入散列数据结构中,这一点至关重要。由于您不知道下一个人将如何处理您的代码,因此最好确保equals(Object)hashCode()具有兼容的语义。