I have a method that merges the elements of the collection, if the fields of these elements are suitable for certain conditions. And under certain conditions, some of the elements need to be removed on the go , but when using foreach cycles, I cannot use delete from the collection because I stumble upon a ConcurrentModificationException . And I have to go through the collection in a double cycle using a counter, and all the time pulling the methods get(...) .
The problem is that the remove(...) operation for an ArrayList very expensive since all the elements need to be shifted. And the operation get(...) expensive for LinkedList . Thus, it turns out that I absolutely need to get rid of either one operation or another.
And I got into an unpleasant fork: I take a LinkedList , and remove get() - I get a ConcurrentModificationException , I take an ArrayList because of the remove(...) method, I lose all the performance.
Please help me to get out of this situation, so that not to lose productivity.
Here is my code:
@Override public Collection<Order> automaticDeals(List<Order> orders) { for (int i = 0; i < orders.size(); i++) { for (int j = 1 ;j < orders.size(); j++) { List<Order> forDelete = deal(orders.get(i), orders.get(j)); for (Order order : forDelete) { orders.remove(order); } } } return orders; } private List<Order> deal(Order fstOrder, Order scdOrder) { List<Order> ordersForDelete = new LinkedList<>(); if (dealIsImpossible(fstOrder, scdOrder)) { return ordersForDelete; } if (fstOrder.getVolume() < scdOrder.getVolume()) { int volume = scdOrder.getVolume() - fstOrder.getVolume(); scdOrder.setVolume(volume); ordersForDelete.add(fstOrder); } else if (fstOrder.getVolume() > scdOrder.getVolume()) { int volume = fstOrder.getVolume() - scdOrder.getVolume(); fstOrder.setVolume(volume); ordersForDelete.add(scdOrder); } else if (fstOrder.getVolume() == scdOrder.getVolume()) { ordersForDelete.add(fstOrder); ordersForDelete.add(scdOrder); } return ordersForDelete; }
ConcurrentModificationException(an error in the iterator) or a logical error in the code. When you delete an item, your orders.size () will change and you will skip some items. - iksuy