2

我需要你的帮助 :

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

我写了一个函数,它比较某个 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”(是的,我知道:我使用了迭代器循环)。

谢谢你的帮助 !

4

5 回答 5

5

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

于 2013-08-16T09:19:23.157 回答
0

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

请参考以下链接 ListUtils.subtract() 如何工作?

于 2013-08-16T09:20:08.000 回答
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
于 2013-08-16T09:24:12.533 回答
0

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

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

于 2013-08-16T09:24:27.440 回答
0

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

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

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

于 2013-08-16T09:24:36.567 回答