Java:比较两个ArrayLists,删除不匹配的值

时间:2013-08-16 09:16:24

标签: java arraylist

我需要你的帮助:

我有一个包含值的特定对象。其中一些值相等,有些不同。 基于相同的值,我需要两个比较这些对象的两个ArrayLists。至少我必须删除所有未存储在两个列表中的条目。

我写了一个函数,它比较了某个Object中的某些字段:

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?

我尝试在类似界面的帮助下对它们进行排序并删除值,但我总是得到'concurrentmodificationexception'(是的,我知道:我使用了迭代器循环)。

感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

ArrayList具有boolean retainAll(Collection another),它仅保留此集合中包含在指定集合中的元素。为了使它在您的情况下工作,您可以使用equals方法创建一个包装原始对象的包装器,该方法仅比较必需的字段并将包装器放在ArrayList中。

答案 1 :(得分:0)

Java Apache公共库提供了减法功能。您可以使用listutils类来减去两个列表之间的值。

请参阅以下链接 How does ListUtils.subtract() work?

答案 2 :(得分: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

答案 3 :(得分:0)

您可以使用Apache CollectionUtils来快速轻松地执行此操作。只需构建匹配的谓词和过滤元素即可。

这里的一些例子 - &gt; http://www.example8.com/category/view/id/1591

答案 4 :(得分:0)

当集合以使打开的迭代器无效的方式更改时,将引发ConcurrentModificationException。当多线程访问非线程安全的集合时,通常会发生这种情况。

在迭代线程中的列表之前,您可以使用java.util.concurrent.CopyOnWriteArrayList或制作副本(或使用Collection.toArray方法获取数组)。

除此之外,在for-each构造中删除会破坏迭代器,因此在这种情况下处理列表不是一种有效的方法。