检查ArrayList是否包含给定对象

Sau*_*s S 21 java list arraylist

假设我有这样的课程:

class A {
  int elementA;
  int elementB
}
Run Code Online (Sandbox Code Playgroud)

我也有ArrayList这样的:ArrayList<A> listObj.

如何仅使用某些属性来检查该列表是否包含对象A?例如,只考虑elementA查找对象newA{elementA}是否已在列表中?

对于对象,A我已经定义了一个equals方法,我只考虑了这个方法elementA,但这还不够.

NIN*_*OOP 25

List#contains()方法使用该equals()方法来评估两个对象是否相同.因此,您需要equals()在类中A覆盖并覆盖hashCode().

@Override
public boolean equals(Object object)
{
    boolean isEqual= false;

    if (object != null && object instanceof A)
    {
        isEqual = (this.elementA == ((A) object).elementA);
    }

    return isEqual;
}

@Override
public int hashCode() {
    return this.elementA;
}
Run Code Online (Sandbox Code Playgroud)

  • 很公平!但是List` contains()`使用`equals`方法,而不是'Comparable.compareTo()`! (2认同)

Har*_*ran 0

hashCode()当涉及到这一点时,数组的 and有点equals()被破坏(这是一个很长的不同讨论为什么)。

一个可能的解决方法是使用ArrayList 的 equals() 方法ArrayList<ArrayList<String>>来代替ArrayList<String[]>ArrayList 的 equals() 方法,这将如您所期望的那样。

例如:

   ArrayList<String> l1 = new ArrayList<>();
    ArrayList<String> l2 = new ArrayList<>();
    l1.add("asdf");
    l2.add("asdf");
    ArrayList<ArrayList<String>> coll = new ArrayList<>();
    coll.add(l1);
    System.out.println(coll.contains(l2));
Run Code Online (Sandbox Code Playgroud)

将产生 true,如预期的那样

另请参阅下面的链接

Java 中查看 ArrayList 是否包含对象的最有效方法