检查ArrayList是否包含给定对象

时间:2013-04-29 07:28:25

标签: java list arraylist

假设我有这样的课程:

class A {
  int elementA;
  int elementB
}

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

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

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

7 个答案:

答案 0 :(得分:23)

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;
}

答案 1 :(得分:3)

您可以调整equals以满足您的需求,但您也可以使用已存在的强大收藏库之一,例如commons-collectionsGuava或{{3} }。它们都具有迭代和谓词结构,允许您根据某些谓词“探索”您的集合。

Commons Collections示例:

boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
    public boolean evaluate(A theA) {
        // Do the comparison
    }
});

答案 2 :(得分:0)

对于这个问题,hashCode()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));

将按预期产生真实

另请参阅以下链接

Most efficient way to see if an ArrayList contains an object in Java

答案 3 :(得分:0)

我不会为此重写equals。即使{1, 1}{1, 2}不能同时出现在列表中,但这两个对象相等。

我会改用Map

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);

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

用于比较arrayList中的对象值。 请关注此链接。 How to compare Objects attributes in an ArrayList?

我希望这个解决方案可以帮到你。 感谢

答案 6 :(得分:0)

List<Upload> mUploadPost = new ArrayList<Upload>();
Upload upload = new Upload();
upload.addName("Mpendulo");
upload.addLastName("Mtshali");
if(!mUploadPost.contains(upload)){
    mUploadPost.add(upload);
}