如何解决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 举报,一经查实,本站将立刻删除。