2013-08-16 104 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构造会破坏迭代器,所以在这种情况下处理列表并不是一种有效的方法。

相关问题