通过arrayList中的条件删除元素

时间:2019-03-31 04:34:13

标签: java arraylist

我正在从称为arrayList的{​​{1}}中删除项目。 我已经建立了一种itemList方法来通过其findItemcallNumber查找项目。

在我的copyNumber中,我使用remove()来找到该项目,然后将其删除。我的问题是我仍然遇到findItem()错误。

我尝试了增强的for循环(我知道这是行不通的),并且我尝试了迭代器(应该可以工作),但仍然出现错误。

这是我尝试使其生效的第三个策略。 还有什么其他策略可以遍历列表并删除项目并绕过concurrentmodificationexception

concurrentmodificationexception

我想要的结果是在条件为真时从列表中删除指定的项目。

2 个答案:

答案 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;

    }