Java-ArrayList <class>的remove()函数(我需要帮助)

时间:2019-03-24 18:30:21

标签: java

我如何删除之前在ArrayList <>中添加的元素,我这样创建它:

public static ArrayList<Product> P = new ArraList<Product>(); 

我使用的方法:

public void removeProduct(Product p) {
    P.remove(p); // this way, did not solve the problem 
} 

//我做了(添加了方法),它可以正常工作,并且一切都很好,我希望有人可以帮助您找到答案并表示感谢:)

public void deleteProduct(String ID) {
    System.out.println("Enter product id to delete: ");
    ID = input.next();
    for(Product m : s.P) {
        if(ID.equals(m.getID())) {
            s.P.remove(ID);
        }
        else {
            System.out.println("ID is not exist");
        }
    }
}

//和

public void removeProductToCart(Product p) {
    viewShoppingCart();
    System.out.println("Enter product id to remove it: ");
    String ID = input.next();
    for(Product r : s.P) {
        if(ID.equals(r.getID())) {
            s.P.remove(p);
        }
        else {
            System.out.println("ID is not exist");
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您需要使用迭代器,否则将获得java.util.ConcurrentModificationException。抛出异常是因为您在列表上执行了2个操作:迭代删除

所以,您需要这样的东西:

for (Iterator<Book> it = s.P.listIterator(); it.hasNext(); ) {
    Product r = it.next();
    if(ID.equals(r.getID())) {
        it.remove(r);
    }
}

因为根本原因是执行2次操作,所以还有另一种方法- 只需在迭代的每个步骤上创建列表的副本:

for(Product m : new ArrayList<>(s.P)) {
    if(ID.equals(m.getID())) {
        s.P.remove(m);
    }
}

注意:出于性能方面的考虑(二次内存使用和每步线性删除),我不建议使用最后一种方法。我给出这个例子只是为了强调引发java.util.ConcurrentModificationException的根本原因。

答案 1 :(得分:1)

2个问题:

  1. s.P是产品列表,而不是字符串,因此调用remove(String)不起作用。
  2. 在for-each循环中删除元素将抛出ConcurrentModificationException

可能的解决方案:

public void removeProductToCart(Product p) {
    viewShoppingCart();
    System.out.println("Enter product id to remove it: ");
    String ID = input.next();
    Product toRemove = null;
    for(Product r : s.P) {
        if(ID.equals(r.getID())) {
            toRemove = r;
            break;
        }
    }
    if(toRemove == null) {
        System.out.println("ID is not exist");
    }
    else {
        s.P.remove(toRemove);
    }
}


如果传递的参数是需要删除的产品,则可以简化此操作。

可以将相同的逻辑应用于第一个功能:

public void deleteProduct(String ID) {
    System.out.println("Enter product id to delete: ");
    ID = input.next();
    Product toRemove = null;
    for(Product r : s.P) {
        if(ID.equals(r.getID())) {
            toRemove = r;
            break;
        }
    }
    if(toRemove == null) {
        System.out.println("ID is not exist");
    }
    else {
        s.P.remove(toRemove);
    }
}

注意:方法参数当前无用。为什么不使用它们而不是循环查找产品?