2013-08-16 103 views
2

我需要你的幫助:Java:比較兩個ArrayList,刪除值不匹配

我有一個包含值的某個對象。其中一些值相等,有些則不同。 基於相同的值我需要兩個比較這些對象的兩個ArrayLists。至少我必須刪除所有未存儲在這兩個列表中的條目。

我寫了一個函數,這在一定的對象比較某些字段:

public void compareTwoValues(certainObj1, certainObj2){ 
    boolean returnStmt = true; 
    for(int i : keysToCheck){ 
    if(!(jop1.returnValueForKey(i).equals(jop2.returnValueForKey(i)))){ 
      returnStmt = false; 
     } 
    } 
    return returnStmt; 
} 

現在我有問題,如何訪問和刪除對象,函數返回false?我試圖通過可比較的接口對它們進行排序並刪除值,但我總是得到'併發修改'(是的,我知道:我使用了迭代器循環)。

感謝您的幫助!

+0

你能提供所需的輸出嗎? –

回答

5

ArrayList具有布爾值retainAll(Collection另一個),它只保留指定集合中包含的此集合中的元素。爲了使它在你的情況下工作,你可以用equals方法創建一個包裝原始對象的包裝器,該方法僅比較必需的字段並將包裝器放入ArrayList中。

+0

列表中的對象的一些值是不相等的... – belafarinrod91

+0

我看,看看我的更新 –

+0

它不按要求工作。如果第一個列表f是{「a」,「b」,「c」},第二個s是{「a」,「b」},那麼調用f.retailnAll(s)不會從f中除去任何東西,但「c」被刪除... – Betlista

0

Java Apache公共庫提供了減法功能。您可以使用listutils類來減去兩個列表之間的值。

How does ListUtils.subtract() work?

+0

這是我的第一種方法,但對象內的某些值不相等。 – belafarinrod91

+0

如果你重寫對象的平等方法,你可以得到正確的輸出 – Murali

+0

好吧,我不知道 - 我會試試這個!非常感謝,我會給你反饋! – belafarinrod91

0

您是否在尋找這個請參考以下鏈接這一點。

public class ProductComparator implements Comparator<Product> 
{ 
     public int compare(Product p1, Product p2) 
     { 
      // do your comparison here 
      return p1.id-p2.id; 
     } 
} 


ArrayList<Product> listProducts = new ArrayList<Product>(); 
listProducts.add(new Product(5, "Soda", 1.00, 1)); 
listProducts.add(new Product(3,"Phone", 300.00, 2)); 
listProducts.add(new Product(4, "Cofee", 5.00, 3)); 
listProducts.add(new Product(5, "Soda", 1.00, 4)); 
listProducts.add(new Product(4, "Cofee", 5.00, 5)); 
listProducts.add(new Product(5, "Soda", 1.00, 6)); 
System.out.println(listProducts.size()); // Total records 

TreeSet<Product> products = new TreeSet<Product>(new ProductComparator()); 
products.addAll(listProducts);     
ArrayList<Product> duplicate = new ArrayList<Product>(); 
duplicate.addAll(products); 
listProducts.removeAll(duplicate); 
System.out.println(products.size()); // Now no duplicates in this set. 
System.out.println(listProducts.size()); // Now only duplicate in this list 
0

一個ConcurrentModificationException的被拋出時,在打開的無效迭代器的方式收集的變化。這通常發生在多線程訪問非線程安全的集合時。

在迭代線程中的列表之前,您可以使用java.util.concurrent.CopyOnWriteArrayList或使用Collection.toArray方法創建副本(或獲取數組)。

除此之外,刪除for-each構造會破壞迭代器,所以在這種情況下處理列表並不是一種有效的方法。

相關問題