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
 
    