I am trying to separate item orders and increase the count if the items have same description and variants otherwise adding a new entry in the arraylist.
The original double foreach loop code is as follows which was giving ConcurrentModificationException:
List<OrderedItem> getSortedItems(List<OrderEcomItem> OrderEcomItems, Context context) {
List<OrderedItem> sorted= new ArrayList<>();
for (OrderEcomItem item : OrderEcomItems) {
final ItemNode itemNode = item.getNodePresentation();
String variants = "";
String description = "";
if (!item.isInStore()) {
variants = itemNode.formatSelectedItems();
description = itemNode.getValue().getDescription();
}
final int id = item.getMenuItemId();
if(sorted.size()>0) {
for (OrderedItem order : sorted) {
if (order.getMenuItemId() == id) {
if (order.getVariants().equals(variants)) {
order.setQuantity(order.getQuantity() + item.getOrderItemQuantity());
order.setAmount(order.getAmount() + Utils.getSubtotal(item));
} else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
Utils.getSubtotal(item),
item.getMenuItemId(), variants, description));
}
}else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
Utils.getSubtotal(item),
item.getMenuItemId(), variants, description));
}
}
}else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
Utils.getSubtotal(item),
item.getMenuItemId(), groups, description));
}
}
return sorted;
}
With listiterator still it is giving ConcurrentModificationException.
List<OrderedItem> getSortedItems(List<OrderEcomItem> orderEcomItems, Context context) {
List<OrderedItem> sorted= new ArrayList<>();
ListIterator<OrderEcomItem> iterator= orderEcomItems.listIterator();
while (iterator.hasNext()){
OrderEcomItem item= iterator.next();
final ItemNode itemNode = item.getNodePresentation();
String variants = "";
String description = "";
String pic = "";
if (!item.isInStore()) {
variants = itemNode.selectedItems();
description = itemNode.getValue().getDescription();
}
final int id = item.getEcomItemId();
if(sorted.size()>0) {
for (OrderedItem order : sorted) {
if (order.getEcomItemId() == id) {
if (order.getVariants().equals(variants)) {
order.setQuantity(order.getQuantity() + item.getOrderItemQuantity());
order.setAmount(order.getAmount() + Utils.getSubtotal(item));
} else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
Utils.getSubtotal(item),
item.getEcomItemId(), variants, description));
}
}else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
Utils.getSubtotal(item),
item.getEcomItemId(), variants, description));
}
}
}else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
Utils.getSubtotal(item),
item.getEcomItemId(), groups, description));
}
}
return sorted;
}
Exception:
java.util.ConcurrentModificationException at java.util.ArrayList$Itr.next(ArrayList.java:831)
Using listIterator on Sorted List
List<OrderedItem> getSortedOrderList(List<OrderEcomItem> orderEcomItems, Context context) {
List<OrderedItem> sorted= new ArrayList<>();
ListIterator<OrderedItem> iterator= sorted.listIterator();
for (OrderEcomItem item : orderEcomItems) {
final ItemNode itemNode = item.getNodePresentation();
String variants = "";
String description = "";
if (!item.isInStoreItem()) {
variants = itemNode.selectedItems();
description = itemNode.getValue().getDesc();
}
final int id = item.getEcomItemId();
if(sorted.size()>0) {
while (iterator.hasNext()){
OrderedItem order= iterator.next();
if (order.getEcomItemId() == id) {
if (!order.getVariants().isEmpty() && order.getVariants().equals(variants)) {
order.setQuantity(order.getQuantity() + item.getOrderItemQuantity());
order.setAmount(order.getAmount() + Utils.getSubtotal(item));
} else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
item.getEcomItemId(), groups, description,
item.getExternalId()));
}
}else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
item.getMenuItemId(), groups, description,
item.getExternalId());
}
}
}else {
sorted.add(
new OrderedItem(item.getName(), item.getOrderItemQuantity(),
item.getEcomItemId(), variants, description,
item.getExternalId()));
}
}
return sorted;
}
}
PS: Please don't mark it duplicate, I have checked list iterator related questions and all of them are using single foreach loop, in my case there are two foreach loops. Kindly provide me solution, where I am doing wrong.
Thanks