Java 检查ArrayList是否包含给定对象
假设我有这样的课:Java 检查ArrayList是否包含给定对象,java,list,arraylist,Java,List,Arraylist,假设我有这样的课: class A { int elementA; int elementB } 我还有一个类似这样的ArrayList:arraylistlistobj 如何检查该列表是否包含仅使用A的某些属性的对象?例如,仅考虑elementA以查找对象newA{elementA}是否已在列表中 代码> A我定义了一个等于方法,在这里我只考虑了 EntEng,但是这还不够。p> 数组的hashCode()和equals()在这个问题上有点支离破碎(这是一个很长的不同讨论,为什么)
class A {
int elementA;
int elementB
}
我还有一个类似这样的ArrayList
:arraylistlistobj
如何检查该列表是否包含仅使用A
的某些属性的对象?例如,仅考虑elementA
以查找对象newA{elementA}
是否已在列表中
<对象>代码> A<代码>我定义了一个<代码>等于方法,在这里我只考虑了<代码> EntEng<代码>,但是这还不够。p> 数组的hashCode()
和equals()
在这个问题上有点支离破碎(这是一个很长的不同讨论,为什么)
一种可能的解决方法是使用ArrayList方法使用equals()
方法来计算两个对象是否相同。因此,您需要重写类A
中的equals()
,还需要重写hashCode()
我不会为此重写equals
。尽管列表中不能同时出现{1,1}
和{1,2}
,但这两个对象并不相等
我会使用地图
:
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);
Map Map=newhashmap();
a1=新的A(1,1);
a2=新的A(1,2);
地图放置(a1.elementA,a1);
//测试是否包含密钥
布尔包含=map.containsKey(a2.elementA);
//用a2覆盖a1
地图放置(a2.elementA,a2);
您可以调整您的equals
以满足您的需要,但您也可以使用现有的功能强大的集合库之一,如或。它们都有迭代和谓词结构,允许您基于某些谓词“探索”集合
Commons集合的示例:
boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
public boolean evaluate(A theA) {
// Do the comparison
}
});
boolean contains=CollectionUtils.exists(myArrayList,new Predicate()){
公共布尔求值(A theA){
//做比较
}
});
以上所有解决方案都适合您的问题。
我想建议你的是!!!
使用集合时,始终将变量数据类型设置为其超类。这将帮助您进行更多的操作并转换为其任何子类
Ex:
List<String> myList = new ArrayList<String>();
Ex:
List myList=new ArrayList();
优点是列表的实现可以更改(例如更改为LinkedList),而不会影响代码的其余部分。使用ArrayList很难做到这一点,不仅因为您需要将ArrayList更改为LinkedList everywhere,还因为您可能使用了ArrayList特定的方法。用于比较ArrayList
中的对象值。
点击这个链接。
我希望这个解决方案能对你有所帮助。
谢谢List mUploadPost=new ArrayList();
上传=新上传();
upload.addName(“Mpendulo”);
upload.addLastName(“Mtshali”);
如果(!mUploadPost.contains(upload)){
添加(上传);
}
显示您的equals
方法。如果您正确地重写了equals(),那么listObj.contains(新的A(elemAvalue))应该可以工作。请注意,您还应该仅考虑elementA值来覆盖hashCode,尽管它在功能上与本例无关。如果(!days.contains(getDate()){days.add(getDate());}
对于用作源(equals和hashCode)的equals,只要您必须比较A元素,但是,一旦需求发生变化,你就可以扔掉它,更不用说你可能想在其他地方使用equals或hashcode方法,我肯定会使用一个比较器。这很公平!但是Listcontains()
使用equals
方法,而不是Comparable.compareTo()
!谢谢你的解决方案。对于像我这样的新手:如果elementA
是String
类型,那么使用isEqual=(this.elementA.equals((A)object.elementA))
如果“elementA”是字符串,我们不需要重写hashCode()方法。我想这不应该设置为答案,而是作为注释。您不能只链接到答案。你必须在这里给出答案。
boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
public boolean evaluate(A theA) {
// Do the comparison
}
});
Ex:
List<String> myList = new ArrayList<String>();
List<Upload> mUploadPost = new ArrayList<Upload>();
Upload upload = new Upload();
upload.addName("Mpendulo");
upload.addLastName("Mtshali");
if(!mUploadPost.contains(upload)){
mUploadPost.add(upload);
}