2013-08-16 5 views
2

Мне нужна ваша помощь:Java: Сравнение двух массивов ArrayLists, удаление значений, которые не соответствуют

У меня есть определенный объект, содержащий значения. Некоторые из этих значений равны, а некоторые отличаются. Основываясь на тех же значениях, мне нужно сравнить два массива 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; 
} 

Теперь у меня есть проблема, как получить доступ и удалять объекты, где функция возвращает ложь?

Я попытался отсортировать их с помощью сопоставимого интерфейса и удалить значения, но у меня всегда есть «concurrentmodificationexception» (да, я знаю: я использовал цикл итератора).

Благодарим за помощь!

+0

Можете ли вы предоставить требуемый ввод, для ввода? –

ответ

5

ArrayList имеет boolean retainAll (коллекция другой), который сохраняет только элементы этой коллекции, которые содержатся в указанной коллекции. Чтобы заставить его работать в вашей ситуации, вы можете создать обертку поверх исходного объекта с помощью метода 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

Вы можете использовать Apache CollectionUtils для того, чтобы сделать это быстро и легко. Просто создайте свой предикат и элементы фильтра, которые соответствуют.

Некоторые примеры здесь ->http://www.example8.com/category/view/id/1591

0

ConcurrentModificationException выбрасывается, когда коллекция изменяется в порядке, что сводит открытые итераторы. Обычно это происходит, когда доступ к коллекции, не являющейся потокобезопасной, осуществляется несколькими потоками.

Вы можете использовать либо java.util.concurrent.CopyOnWriteArrayList, либо сделать копию (или получить массив с методом Collection.toArray) перед повторением списка в потоке.

Кроме того, удаление в каждой конструкции прерывает итератор, поэтому это недействительный способ обработки списка в этом случае.

Смежные вопросы