如果项目具有相同的描述和变体,我将尝试分离项目订单并增加计数,否则在数组列表中添加一个新条目。
最初的双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(), 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。
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
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循环。请提供我的解决方案,我做错了。
谢谢
发布于 2021-04-05 03:34:59
我想你的问题是这句话:
sorted.add(...)在循环中迭代排序列表。您正在迭代排序数组中的元素,并在循环中向列表中添加新元素。这将抛出ConcurrentModificationException。我建议把它们加到单独的单子上。
https://stackoverflow.com/questions/66947897
复制相似问题