2013-04-29 148 views
15

请考虑我有对象A{int elementA; int elementB}。这些对象存储在arraylist, ArrayList<A> listObj中。检查java arraylist是否包含对象

如何仅使用部分对象A属性执行包含操作,例如,只考虑elementA用于查找对象newA{elementA}是否已在列表中?

对于对象A我已经定义了等于,我只考虑elementA(对象A的一部分),但是这还不够。

所以很高兴能有一些想法,如何包含可以应用和使用的对象的部分? (如果标准功能可以处理这个问题,编写我自己的功能是一个选项,但是有趣的是)

+0

显示你的'equals'方法。 – NINCOMPOOP 2013-04-29 07:30:19

+0

如果你已经正确地重写了你的equals(),那么listObj.contains(new A(elemAvalue))应该可以工作。请注意,您也应该只考虑elementA值来重写hashCode,虽然它在本例中与功能无关。 – misberner 2013-04-29 07:42:11

+0

'if(!days.contains(getDate())){ days.add(getDate()); }' – 2013-04-29 07:47:17

回答

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

21

List#contains()方法使用equals()方法来评价,如果两个对象是相同。因此,您需要覆盖类别A中的equals(),并覆盖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; 
} 
+0

只要你必须比较A元素,这个工作正常,但只要需求改变,你可以抛出这个,更不用说你可能想在其他地方使用equals或hashcode方法,我会去与比较这是肯定的。 – 2013-04-29 08:07:51

+2

够公平的!但List'contains()'使用'equals'方法,而不是'Comparable.compareTo()'! – NINCOMPOOP 2013-04-29 08:17:20

+0

感谢您的解决方案。对于像我这样的新手:如果'elementA'是'String'类型,那么使用'isEqual =(this.elementA.equals(((A)object).elementA));' – 2016-08-24 15:39:07

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

你可以调整你的equals,以适应您的需求,但你也可以使用已经存在的强大的集合库之一,像commons-collectionsGuavalambdaj 。它们都有迭代和谓词结构,允许您根据谓词“探索”您的集合。

例与共享类别:

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

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

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

List的实现可以更改(例如LinkedList),而不会影响其余代码的优点。这对于ArrayList来说很难做到,不仅因为您需要将ArrayList更改为LinkedList,而且还因为您可能已经使用了ArrayList特定的方法。

0

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

我希望这个解决方案能帮助你。 谢谢

+0

这不应该被设置为答案I猜测,但作为评论。 – NatNgs 2018-01-17 12:52:55

+0

你不能只是链接回答。你必须在这里给出答案。 – 2018-01-17 13:26:59

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/18543188) – 2018-01-17 13:27:19

相关问题