2014-03-30 51 views
1

我想實現一個簡單的檢查,看看arraylist是否是另一個的子集。試圖檢查如果arraylist是另一個的子集

我在我的兩個列表中有以下元素,列表1 [A F K]和列表2 [B A C F K]。 list1包含list2中的所有元素,所以它應該返回true

我試過使用list1.containsAll(list2),但它並沒有給我真實的。

我試着循環遍歷這兩個列表,如果發現匹配,我在第一個列表中清空那個位置,但它不工作,因爲我認爲它遭受了併發修改。這是我的代碼

公共靜態布爾isSubset(樹節點T1,T2樹節點){

ArrayList<String> subTreeList = new ArrayList<String>(); 
    ArrayList<String> mainTreeList = new ArrayList<String>(); 

     treeCopyToList(t1,subTreeList); 
     treeCopyToList(t2,mainTreeList); 

     int mainTreeSize = mainTreeList.size(); 

    for(int i = 0; i < subTreeList.size(); i++){ 
     for(int j = 0; j < mainTreeSize; j++){ 
      if(subTreeList.get(i).equals(mainTreeList.get(j))){ 
       subTreeList.remove(i); 
      } 
     } 
    } 
    System.out.println(subTreeList); 
    return subTreeList.isEmpty(); 
} 

這裏subTreeList最終輸出[A]。我知道它跳過中間元素,因爲當我刪除大小元素也被修改。我如何着手解決這個問題,以便我最終得到一個空列表。

+3

「我嘗試使用list1.containsAll(list2),但它並沒有給我真實的。」 - 你爲什麼這麼認爲? –

+0

看着你的代碼......我看不出它是如何迭代的。你正在用一個空的'ArrayList'實例化'subTreeList',所以我不相信它會迭代。也就是說,除非在這裏有什麼東西你不分享;在這種情況下,我也鼓勵你發佈你嘗試使用'containsAll'的舊方法。 – Makoto

+0

抱歉,我沒有給出完整的代碼。其實我有一個輔助方法來填充這兩個列表。我會編輯代碼 – Htlcs

回答

2

您使用containsAll的順序倒退了。

您試圖確定list2是否包含list1中的所有元素,如果list1包含list2中的所有元素,則不是。

簡單地顛倒它,它應該爲你工作。

+0

非常感謝。我不知何故也嘗試增加一個計數器,當if條件爲真,並且當計數器達到初始列表大小時,我將返回true。 (subTreeList.get(i).equals(mainTreeList.get(j))) if(subTreeList.get(i).equals(mainTreeList.get(j))){ \t \t \t counter ++; \t \t} \t return(counter == subTreeSize); – Htlcs

+0

我解決了你的建議,但現在我很好奇,如何解決併發修改問題,如果我嘗試通過刪除方法來完成。我應該如何解決它在我的初始代碼? – Htlcs

+0

@JimZilla使用迭代器和刪除方法。但是,如果您還有其他問題與這個問題沒有關聯,請諮詢另一個問題。 –

相關問題