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方法,我肯定会使用一个比较器。这很公平!但是List
contains()
使用
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);
}