2013-05-31 23 views
1

工作的ArrayList我使用以下代碼:。載()操作者與對象不

final UnassignedSubjectData selsub = (UnassignedSubjectData) spinSelectSubject 
      .getSelectedItem(); 
ArrayList<UnassignedSubjectData> selectedSubjectList = null; 
    if (selsubdata != null) { 
     selectedSubjectList = new ArrayList<UnassignedSubjectData>(
       Arrays.asList(selsubdata)); 
     Log.d(LOGTAG, "Check " + selsub.toString()); 
     Log.d(LOGTAG, "Check " + selectedSubjectList.toString()); 
     Log.d(LOGTAG, "Result for if " 
       + Arrays.asList(selsubdata).contains(Arrays.asList(selsub))); 
if (selectedSubjectList.contains(Arrays.asList(selsub))) { 
      CustomToast.showCustomToast(this, 
        "Subject already present in list"); 
      Log.d(LOGTAG, 
        "IN IF after TOAST " + selectedSubjectList.toString()); 
      return; 
     } 
     else 
      Log.d(LOGTAG, "Showing subject not in list"); 
    } 

selsubUnassignedSubjectData一個對象。

我得到的logcat中的條件進行下列操作之一:

Check History 
Check [History, Science, Science, History] 
Result for if false 
Showing subject not in list 

這意味着,即使對象是存在於ArrayList.contains()操作無法正常工作。 請幫我找到一個解決方案。

+1

你爲''UnassignedSubjectData'類實現了'equals'和'hashCode'嗎?你爲什麼要在另一個列表中放入一個元素的列表? – NilsH

+0

@NilsH我把一個元素放在其他列表中,只是因爲帶有一個元素的.contains()沒有工作......但是嘗試這個也沒有工作 – 7bluephoenix

+1

可能是因爲你沒有實現'equals'和'hashCode'。 – NilsH

回答

3

首先,@LuiggiMendoza指出,呼叫,因爲你要尋找的元素,而不是一個子表

Arrays.asList(selsubdata).contains(Arrays.asList(selsub)) 

永遠不會返回true這裏。更改爲:

Arrays.asList(selsubdata).contains(selsub) 

其次,List#contains()用來進行比較的列表元素的equals()方法。從Object繼承的默認equals()比較引用,這將不會按需要工作。

對於要正確地爲您的對象工作,您需要爲UnassignedSubjectData實施equals()(和hashCode())。

hashCode()實際上不需要進行比較,但它應該始終與equals()一起實施。

+2

如果仔細閱讀代碼,OP會試圖驗證'Arrays.asList(selsubdata)'是否包含'Arrays.asList(selsub)'。解決這個問題後,你的答案是有效的。 –

+0

@LuiggiMendoza你的權利...我把一個元素放在asList的其他列表中,只是因爲帶有一個元素的.contains()不工作...但是嘗試這個也沒有工作 – 7bluephoenix

+1

@ 7bluephoenix問題在於你'重新驗證你的列表是否包含'List '實例,它總是會給你'false'。請閱讀['List#contains']的JavaDoc(http://docs.oracle.com/javase/7/docs/api/java/util/List.html#contains(java.lang.Object)) –

1

Ovevride equals()hashcode()對其中要定義平等的基礎上的屬性。然後,將適用於這些屬性。