我正在从称为arrayList
的{{1}}中删除项目。
我已经建立了一种itemList
方法来通过其findItem
和callNumber
查找项目。
在我的copyNumber
中,我使用remove()
来找到该项目,然后将其删除。我的问题是我仍然遇到findItem()
错误。
我尝试了增强的for循环(我知道这是行不通的),并且我尝试了迭代器(应该可以工作),但仍然出现错误。
这是我尝试使其生效的第三个策略。
还有什么其他策略可以遍历列表并删除项目并绕过concurrentmodificationexception
?
concurrentmodificationexception
我想要的结果是在条件为真时从列表中删除指定的项目。
答案 0 :(得分:0)
根据某些条件从列表中删除项目。
List<Integer> al = new ArrayList<>();
al.add(605);
al.add(260);
al.add(306);
al.add(7);
al.add(6);
Iterator itr = al.iterator();
while (itr.hasNext()) {
int x = (Integer) itr.next();
if (x < 300)
itr.remove();
}
System.out.println(" ArrayList : " + al);
答案 1 :(得分:0)
解决方案1 :
遍历循环时,您尝试在remove()
操作中更改List值。这将导致ConcurrentModificationException
。
Iterator.remove()
是安全的,您可以像这样使用它:
这是您的代码:
public static boolean deleteItem(String callNumber, int copy) {
for (Iterator<Item> it = itemList.iterator(); it.hasNext(); ) {
Item rItem = it.next();
if (rItem.getCallNumber().equals(callNumber)
&& rItem.getCopyNumber() == copy) {
it.remove();
return true;
}
}
return false;
}
请注意,Iterator.remove()
是在迭代期间修改集合的唯一安全方法。如果在迭代进行过程中以其他方式修改了基础集合,则行为不确定。
您的数据在这里:
itemList = new ArrayList<>();
itemList.add(new Item("0012", 1));
itemList.add(new Item("0013", 2));
itemList.add(new Item("0014", 3));
itemList.add(new Item("0015", 1));
String deletedItem="0014";
int copy=3;
boolean isDeleted=deleteItem(deletedItem,copy);
System.out.println(deletedItem+" deleted status :"+isDeleted);
System.out.println();
deletedItem="0012";
copy=1;
isDeleted=deleteItem(deletedItem,copy);
System.out.println(deletedItem+" deleted status :"+isDeleted);
解决方案2 :
在迭代Arraylist
时,不允许您删除任何项目。如果要在迭代时删除项目,可以将删除的项目添加到新创建的ArrayList
中。
removeList
迭代完成后,您可以一次将其全部删除。
List<Item> removeList = new ArrayList<>();
for (Item tempItem : itemList) {
if (tempItem.getCopyNumber() > 1) {
Item deleteItem = getItemForDeleteItem(tempItem.getCallNumber(), tempItem.getCopyNumber());
removeList.add(deleteItem);
}
}
if (removeList.size() > 0) {
System.out.println("Removing Item Size :"+removeList);
itemList.removeAll(removeList);
}
在这里,您要选择copyNumber> 1的那些项。如果有效,它将添加到 removeList 。迭代完成后,我将使用itemList.removeAll(removeList);
您的项目获取方法
public static Item getItemForDeleteItem(String callNumber, int copy) {
for (Iterator<Item> it = itemList.iterator(); it.hasNext(); ) {
Item rItem = it.next();
if (rItem.getCallNumber().equals(callNumber)
&& rItem.getCopyNumber() == copy) {
return rItem;
}
}
return null;
}