2012-12-05 53 views
2

我有兩個ArrayLists如圖所示 - pinklistnormallist。我比較他們與在代碼如下所示發現無論從獨特的重複值:比較兩個的ArrayList獲取獨特的和重複的值

List<String> pinklist = t2.getList(); 
List<String> normallist = t.getList(); 
ArrayList<String> duplicatevalues = new ArrayList<String>(); 
ArrayList<String> uniquevalues = new ArrayList<String>(); 

for (String finalval : pinklist) { 
    if (pinklist.contains(normallist)) { 
     duplicatevalues.add(finalval); 
    } else if (!normallist.contains(pinklist)) { 
     uniquevalues.add(finalval); 
    } 
} 

我正確地得到duplicateValues,但我沒有得到的唯一值。

回答

15

你忽略條件中的finalval,而問一​​個列表是否包含其他列表

你可以做這樣的:

// Variable names edited for readability 
for (String item : pinkList) { 
    if (normalList.contains(item)) { 
     duplicateList.add(item); 
    } else { 
     uniqueList.add(item); 
    } 
} 

我不會真的,雖然稱之爲「獨特的」或「重複」的項目 - 這些通常是關於項目的一個集合內。這只是測試一個列表中的每個項目是否在另一個列表中。在這種情況下,它更像是「現有」和「新」,我會說。

注意,因爲你在一個基於集合的方式處理這些問題,我用一組實施諸如HashSet<E>,而不是列出建議。該SetsGuava提供了與工作組有用的方法。

0

做這種方式 -

for (String finalval : pinklist) 
{ 
    if(normallist.contains(finalval)) 
    { 
     // finalval is both in pinklist and in 
     // normallist. Add it as a duplicate. 
     duplicatevalues.add(finalval); // this will get you the duplicate values 
    } 
    else { 
     // finalval is in pinklist but not in 
     // normallist. Add it as unique. 
     uniquevalues.add(finalval); // this will get you the values which are in 
             // pinklist but not in normallist 
    } 
} 

// This will give you the values which are 
// in normallist but not in pinklist. 
for(String value : normallist) { 
    if(!pinklist.contains(value)) { 
     uniquevalues.add(value); 
    } 
} 
+0

護理來解釋你的代碼?僅有代碼的答案並不是那麼好。 – Makoto

+0

@Makoto:我現在已經解釋了我的代碼。我認爲現在是可以理解的。 –

8

這應該這樣做:

List<String> pinklist = t2.getList(); 
List<String> normallist = t.getList(); 
ArrayList<String> duplicatevalues = new ArrayList<String> 
     (new List(normallist).retainAll(pinklist)); 
ArrayList<String> uniquevalues = new ArrayList<String> 
     (new List(normallist).removeAll(pinklist)); 

釋:

  • List可以採取另外一種列表作爲構造函數的參數,並複製它的值。

  • retainAll(...)將刪除所有不存在於...中的條目。

  • removeAll(...)將刪除...中確實存在的所有條目。

  • 我們不希望刪除/保留在原來的名單,因爲這將修改它,所以我們將它們複製,在構造函數中。

+0

小心解釋你的代碼?特別是你克隆列表的部分。 – Makoto

+1

@Makoto只是急着想出一個答案。我立即開始編輯。 – Mordechai

-1

爲什麼要將整個列表傳遞給contains方法?相反,你應該通過finalval