2013-04-29 203 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

相關問題