繁体   English   中英

通过arrayList中的条件删除元素

[英]Removing an element by condition in an arrayList

我正在从名为itemListarrayList删除项目。 我已经做了一个findItem方法,通过它的callNumbercopyNumber查找一个项目。

在我的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM