假设我有这样的课程:
class A {
int elementA;
int elementB
}
我也有ArrayList
这样的:ArrayList<A> listObj
。
如何仅使用A
的某些属性来检查该列表是否包含对象?例如。仅考虑elementA
来查找对象newA{elementA}
是否已在列表中?
对于对象A
,我已经定义了equals
方法,我只考虑elementA
,但这还不够。
答案 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-collections,Guava或{{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);
}