微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ListIterator ConcurrentModificationException

如何解决ListIterator ConcurrentModificationException

如果项目具有相同的描述和变体,我正在尝试分隔项目订单并增加计数,否则在数组列表中添加一个新条目。

原来的双 foreach 循环代码如下,它给出了 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(),description));
      }
    }
  }else {
      sorted.add(
          new OrderedItem(item.getName(),groups,description));
  }
}
return sorted;

}

listiterator 仍然给出 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.getEcomItemId(),description));
      }
    }
  }else {
    sorted.add(
        new OrderedItem(item.getName(),description));
  }
}
return sorted;


 }

异常:

java.util.ConcurrentModificationException 在 java.util.ArrayList$Itr.next(ArrayList.java:831)

在排序列表上使用 listIterator

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(),description,item.getExternalId()));
            }
          }else {
            sorted.add(
                new OrderedItem(item.getName(),item.getExternalId());
          }
        }
      }else {
        sorted.add(
            new OrderedItem(item.getName(),item.getExternalId()));
      }
    }
    return sorted;
  }

}

PS:请不要将其标记为重复,我已经检查了与列表迭代器相关的问题,并且所有这些问题都使用单个 foreach 循环,在我的情况下有两个 foreach 循环。 请为我提供解决方案,我做错了。

谢谢

解决方法

我认为你的问题是这一行:

sorted.add(...)

在您迭代排序列表的循环内。 您正在遍历已排序数组中的元素,并在循环中向列表中添加新元素。这将抛出 ConcurrentModificationException。我建议将它们添加到单独的列表中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。