[英]Removing an element by condition in an arrayList
我正在从名为itemList
的arrayList
删除项目。 我已经做了一个findItem
方法,通过它的callNumber
和copyNumber
查找一个项目。
在我的remove()
我使用findItem()
定位该项目,然后将其删除。 我的问题是我仍然遇到concurrentmodificationexception
异常错误。
我已经尝试了增强的for循环(我知道这是行不通的),并且我已经尝试了迭代器(应该可以工作)并且仍然收到错误。
这是我尝试使其生效的第三个策略。 还有哪些其他策略可以遍历列表并删除项目并绕过concurrentmodificationexception
?
/**
* Finds an item by call number and copy number.
*
* @param callNumber the call number
* @param copy the copy number
* @return the item, if not found return null
*/
private Item getItem(String callNumber, int copy)
{
for (int i = 0; i < numItems; i++)
{
Item item = itemList.get(i);
if (item.getCallNumber() != null
&& item.getCallNumber().equals(callNumber)
&& item.getCopyNumber() == copy)
{
return item;
}
}
return null;
}
/**
* Deletes a item from the library.
*
* @param callNumber the call number of the item to be deleted.
* @param copy the copy number of the item to be deleted.
* @return <code>true</code> if the item was deleted successfully,
* and <code> false</code> if the item was not deleted.
*/
public boolean deleteItem(String callNumber, int copy)
{
Item rItem = getItem(callNumber, copy);
if(rItem == null)
{
return false;
}
if (rItem.getCallNumber().equals(callNumber)
&& rItem.getCopyNumber() == copy)
{
itemList.remove(rItem);
numItems--;
return true;
}
return false;
}
我期望的结果是在条件为真时从列表中删除指定的项目。
在某些情况下,从列表中删除项目。
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 :
在循环中进行迭代时,您尝试在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);
删除所有项目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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.