2013-10-03 74 views
25

我有2個字符串對象的arraylist。簡單的比較2 ArrayList的方法

List<String> sourceList = new ArrayList<String>(); 
List<String> destinationList = new ArrayList<String>(); 

我有一些邏輯,我需要處理源列表,並將結束與目的地列表。目標列表將添加一些額外的元素添加到源列表或從源列表中刪除。

我的預期輸出是2個ArrayList的字符串,其中第一個列表應該從源中移除所有字符串,第二個列表應該包含所有新添加到源的字符串。

任何更簡單的方法來實現這個?

+6

你到目前爲止嘗試了什麼? –

+9

對不起,老兄讀了3遍。沒有得到你所問的。順便說一句,你的代碼在哪裏? –

+0

用於循環來實現它。尋找一些第三方apis .. – prabu

回答

46

轉換詞典來Collection並使用removeAll

Collection<String> listOne = new ArrayList(Arrays.asList("a","b", "c", "d", "e", "f", "g")); 
    Collection<String> listTwo = new ArrayList(Arrays.asList("a","b", "d", "e", "f", "gg", "h")); 


    List<String> sourceList = new ArrayList<String>(listOne); 
    List<String> destinationList = new ArrayList<String>(listTwo); 


    sourceList.removeAll(listTwo); 
    destinationList.removeAll(listOne); 



    System.out.println(sourceList); 
    System.out.println(destinationList); 

輸出:

[c, g] 
[gg, h] 

[編輯]

其他方式(更清晰)

Collection<String> list = new ArrayList(Arrays.asList("a","b", "c", "d", "e", "f", "g")); 

    List<String> sourceList = new ArrayList<String>(list); 
    List<String> destinationList = new ArrayList<String>(list); 

    list.add("boo"); 
    list.remove("b"); 

    sourceList.removeAll(list); 
    list.removeAll(destinationList); 


    System.out.println(sourceList); 
    System.out.println(list); 

輸出:

[b] 
[boo] 
+3

如果你想通過「removeAll」比較自定義對象,不要忘記實現「equals」和「hashCode」方法。 – Denis

0

據我理解正確的話,我認爲這是最簡單的用4所列出的工作: - 您SOURCELIST - 你DESTINATIONLIST - 一個removedItemsList - 一個newlyAddedItemsList

9

這應該檢查兩個列表是否相等,它首先進行一些基本檢查(即,空值和長度),然後進行排序並使用collections.equals方法檢查它們是否相等。

public boolean equalLists(List<String> a, List<String> b){  
    // Check for sizes and nulls 

    if (a == null && b == null) return true; 


    if ((a == null && b!= null) || (a != null && b== null) || (a.size() != b.size())) 
    { 
     return false; 
    } 

    // Sort and compare the two lists   
    Collections.sort(a); 
    Collections.sort(b);  
    return a.equals(b); 
} 
+11

你檢查後,如果列表爲空,你檢查他們的大小後..這是錯誤的 –

+0

'(a == null && b!= null)|| (a!= null && b == null))' 對於這部分,你可以檢查'(a!= b)' – NurShomik

0

最簡單的方法是通過一個 這樣一個信號源和目的地列表進行迭代:

List<String> newAddedElementsList = new ArrayList<String>(); 
List<String> removedElementsList = new ArrayList<String>(); 
for(String ele : sourceList){ 
    if(destinationList.contains(ele)){ 
     continue; 
    }else{ 
     removedElementsList.add(ele); 
    } 
} 
for(String ele : destinationList){ 
    if(sourceList.contains(ele)){ 
     continue; 
    }else{ 
     newAddedElementsList.add(ele); 
    } 
} 

雖然它可能不是非常有效的,如果你的源和目標列表有許多因素,但肯定它更簡單。

4

轉換的ListString並檢查字符串是否相同或不

import java.util.ArrayList; 
import java.util.List; 



/** 
* @author Rakesh KR 
* 
*/ 
public class ListCompare { 

    public static boolean compareList(List ls1,List ls2){ 
     return ls1.toString().contentEquals(ls2.toString())?true:false; 
    } 
    public static void main(String[] args) { 

     ArrayList<String> one = new ArrayList<String>(); 
     ArrayList<String> two = new ArrayList<String>(); 

     one.add("one"); 
     one.add("two"); 
     one.add("six"); 

     two.add("one"); 
     two.add("two"); 
     two.add("six"); 

     System.out.println("Output1 :: "+compareList(one,two)); 

     two.add("ten"); 

     System.out.println("Output2 :: "+compareList(one,two)); 
    } 
} 
+3

,但你不知道命令! – Khatri

2

答案在@dku-rajkumar後給出。

ArrayList commonList = CollectionUtils.retainAll(list1,list2);

0
private int compareLists(List<String> list1, List<String> list2){ 
    Collections.sort(list1); 
    Collections.sort(list2); 

    int maxIteration = 0; 
    if(list1.size() == list2.size() || list1.size() < list2.size()){ 
     maxIteration = list1.size(); 
    } else { 
     maxIteration = list2.size(); 
    } 

    for (int index = 0; index < maxIteration; index++) { 
     int result = list1.get(index).compareTo(list2.get(index)); 
     if (result == 0) { 
      continue; 
     } else { 
      return result; 
     } 
    } 
    return list1.size() - list2.size(); 
} 
0

如果你的要求是保持插入順序加上檢查兩個數組列表中的內容,那麼你應該做以下:

List<String> listOne = new ArrayList<String>(); 
List<String> listTwo = new ArrayList<String>(); 

listOne.add("stack"); 
listOne.add("overflow"); 

listTwo.add("stack"); 
listTwo.add("overflow"); 

boolean result = Arrays.equals(listOne.toArray(),listTwo.toArray()); 

這將返回true。

但是,如果更改,例如排序:

listOne.add("stack"); 
listOne.add("overflow"); 

listTwo.add("overflow"); 
listTwo.add("stack"); 

boolean result = Arrays.equals(listOne.toArray(),listTwo.toArray()); 

會順序是不同返回false。