我需要你的帮助:
我有一个包含值的特定对象。其中一些值相等,有些不同。 基于相同的值,我需要两个比较这些对象的两个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'(是的,我知道:我使用了迭代器循环)。
感谢您的帮助!
答案 0 :(得分:5)
ArrayList具有boolean retainAll(Collection another),它仅保留此集合中包含在指定集合中的元素。为了使它在您的情况下工作,您可以使用equals方法创建一个包装原始对象的包装器,该方法仅比较必需的字段并将包装器放在ArrayList中。
答案 1 :(得分:0)
Java Apache公共库提供了减法功能。您可以使用listutils类来减去两个列表之间的值。
答案 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构造中删除会破坏迭代器,因此在这种情况下处理列表不是一种有效的方法。