25

假设我有这样的课:

class A {
  int elementA;
  int elementB
}

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

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

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

4

7 回答 7

32

List#contains()方法使用该equals()方法来评估两个对象是否相同。因此,您需要equals()在 Class中覆盖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;
}
于 2013-04-29T07:33:22.137 回答
4

您可以equals根据自己的需要进行调整,但您也可以使用已经存在的强大集合库之一,例如commons-collectionsGuavalambdaj。它们都有迭代和谓词结构,允许您基于某些谓词“探索”您的集合。

Commons Collections 示例:

boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
    public boolean evaluate(A theA) {
        // Do the comparison
    }
});
于 2013-04-29T07:43:21.957 回答
1

我不会equals为此覆盖。即使{1, 1}and{1, 2}不能同时出现在您的列表中,这两个对象也不相等。

我会使用 aMap代替:

Map<Integer, A> map = new HashMap<>();
A a1 = new A(1, 1);
A a2 = new A(1, 2);

map.put(a1.elementA, a1);

// test if key is contained
boolean contains = map.containsKey(a2.elementA);

// overwrite a1 with a2
map.put(a2.elementA, a2);
于 2013-04-29T07:38:27.817 回答
0

以上所有解决方案都适合您的问题。我想在这里建议你的是!!!每当您使用集合时,请始终将变量数据类型添加到其超类中。这将帮助您进行更多操作并转换为它的任何子类。

Ex:
List<String> myList = new ArrayList<String>();

List 的实现可以更改(例如更改为 LinkedList)的优点,而不会影响其余代码。使用 ArrayList 很难做到这一点,不仅因为您需要在任何地方将 ArrayList 更改为 LinkedList,还因为您可能使用了 ArrayList 特定的方法。

于 2013-05-03T10:17:12.593 回答
0

hashCode()equals()of 数组在谈到这个时有点坏了(这是一个很长的不同讨论为什么)。

一种可能的解决方法是使用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));

正如预期的那样,将产生真实的

也可以参考下面的链接

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

于 2013-04-29T07:31:39.803 回答
0
List<Upload> mUploadPost = new ArrayList<Upload>();
Upload upload = new Upload();
upload.addName("Mpendulo");
upload.addLastName("Mtshali");
if(!mUploadPost.contains(upload)){
    mUploadPost.add(upload);
}
于 2019-09-11T00:15:29.283 回答
0

用于比较 中的对象值arrayList。按照这个链接。 如何比较 ArrayList 中的对象属性?

我希望这个解决方案能帮助你。谢谢

于 2018-01-17T12:32:38.693 回答