2013-10-03 28 views
25

2 nesne dize nesnesine sahibim.Karşılaştırmak için basit bir yöntem 2 ArrayLists

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

Kaynak listesini işlemem gereken ve hedef listesiyle sonuçlanacak bir mantığım var. Hedef listede, kaynak listesine eklenmiş veya kaynak listeden kaldırılmış bazı ek öğeler bulunur.

My beklenen çıkışı ilk liste yeni kaynağına eklenen tüm dizeleri olmalıdır kaynağı ve ikinci listeden kaldırılır tüm dizeleri olmalıdır dize 2 ArrayList olduğunu.

Bunu başarmak için daha basit bir yöntem var mı?

+6

Şimdiye kadar ne denediniz? –

+9

Üzgünüz, 3 kez okudum. Ne istediğini anlamadım. BTW, kodun nerede? –

+0

Bunu başarmak için döngüler için kullanılır. Bazı üçüncü taraf apis arıyor .. – prabu

cevap

46

Collection için Listeleri dönüştürme ve kullanımı 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); 

Çıkış:

[c, g] 
[gg, h] 

[DÜZ]

başka bir şekilde (daha açık)

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); 

Çıktı:

[b] 
[boo] 
+3

"removeAll" ile özel nesneleri karşılaştırmak istiyorsanız "eşittir" ve "hashCode" yöntemlerini uygulamak için unutmayın. – Denis

0

Bildiğim kadarıyla doğru anladığım kadarıyla, ben 4 listeleri ile çalışmak kolay olduğunu düşünüyorum: - Sizin SourceList - Sizin DESTINATIONLIST - Bir removedItemsList - Bir newlyAddedItemsList

9

Bu iki listenin eşit olup olmadığını kontrol etmeli, önce bazı temel kontrolleri yapar (örn. nulls ve lengths), sonra eşit olup olmadığını kontrol etmek için collections.equals yöntemini sıralar ve kullanır. Kaynak ve hedef listeleri birçok unsurlar var ama kesinlikle eğer çok verimli olmayabilir rağmen

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); 
    } 
} 

:

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

Listelerin boyutlarını kontrol ettikten sonra null olup olmadığını kontrol edersiniz. Bu yanlış –

+0

'(a == null && b! = Null) || (a! = null && b == null)) Bu bölüm için, sadece kontrol edebilirsiniz (a! = b) ' – NurShomik

0

en basit yolu, bir böyle biri tarafından kaynak ve hedef listeleri aracılığıyla yineleme etmektir daha basit.

4

String için List dönüştürme ve

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

, ama siparişi bilmiyorsunuz! – Khatri

2

cevap @dku-rajkumar mesajda verilmiştir dizeleri aynı olup olmadığını kontrol ya da değil. İhtiyaçlarınız sonra aşağıdakileri yapmanız gerekir yerleştirme düzeni korumak artı iki arraylist içeriğini kontrol etmek ise

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()); 

Bu doğru dönecektir.Örneğin sıralamasını değiştirmek eğer

Ancak: sipariş farklı olduğu

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

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

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

yanlış dönecektir.

İlgili konular