假设我有这样的课:
class A {
int elementA;
int elementB
}
我也有ArrayList
这样的:ArrayList<A> listObj
。
如何检查该列表是否包含仅使用某些属性的对象A
?例如,仅考虑elementA
查找对象newA{elementA}
是否已在列表中?
对于对象,A
我定义了一个equals
方法,我只考虑elementA
,但这还不够。
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;
}
您可以equals
根据自己的需要进行调整,但您也可以使用已经存在的强大集合库之一,例如commons-collections、Guava或lambdaj。它们都有迭代和谓词结构,允许您基于某些谓词“探索”您的集合。
Commons Collections 示例:
boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
public boolean evaluate(A theA) {
// Do the comparison
}
});
我不会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);
以上所有解决方案都适合您的问题。我想在这里建议你的是!!!每当您使用集合时,请始终将变量数据类型添加到其超类中。这将帮助您进行更多操作并转换为它的任何子类。
Ex:
List<String> myList = new ArrayList<String>();
List 的实现可以更改(例如更改为 LinkedList)的优点,而不会影响其余代码。使用 ArrayList 很难做到这一点,不仅因为您需要在任何地方将 ArrayList 更改为 LinkedList,还因为您可能使用了 ArrayList 特定的方法。
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));
正如预期的那样,将产生真实的
也可以参考下面的链接
List<Upload> mUploadPost = new ArrayList<Upload>();
Upload upload = new Upload();
upload.addName("Mpendulo");
upload.addLastName("Mtshali");
if(!mUploadPost.contains(upload)){
mUploadPost.add(upload);
}
用于比较 中的对象值arrayList
。按照这个链接。
如何比较 ArrayList 中的对象属性?
我希望这个解决方案能帮助你。谢谢