首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListIterator ConcurrentModificationException

ListIterator ConcurrentModificationException
EN

Stack Overflow用户
提问于 2021-04-05 03:25:46
回答 1查看 53关注 0票数 0

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

最初的双foreach循环代码如下所示,它给出了ConcurrentModificationException:

代码语言:javascript
复制
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;

}

在listiterator仍然存在的情况下,它给了ConcurrentModificationException。

代码语言:javascript
复制
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;


 }

例外:

java.util.ArrayList$Itr.next(ArrayList.java:831)的

java.util.ConcurrentModificationException

在排序列表上使用listIterator

代码语言:javascript
复制
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:请不要把它标记为重复,我已经检查了列表迭代器相关的问题,它们都是使用单个foreach循环,在我的例子中有两个foreach循环。请提供我的解决方案,我做错了。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-04-05 03:34:59

我想你的问题是这句话:

代码语言:javascript
复制
sorted.add(...)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66947897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档