关于Java:Java – ArrayList的remove()函数< class>

Java - remove() function for ArrayList<class> (I need help)

本问题已经有最佳答案,请猛点这里访问。

如何删除我以前在arraylist中添加的元素<>我创建它的方式如下:

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

我使用的方法:

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

//I did the(added the method)and it works and everything are fine,I hope someone could to get the answer and thanks:)我做了(添加了方法),一切都很好,希望有人能帮我找到答案,谢谢:)

1
2
3
4
5
6
7
8
9
10
11
12
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");
        }
    }
}

/ /和

1
2
3
4
5
6
7
8
9
10
11
12
13
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个问题:

  • S.P是产品列表,而不是字符串,因此调用remove(string)不起作用。
  • 删除for each循环中的元素将引发ConcurrentModificationException
  • 可能的解决方案:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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);
        }
    }

    如果传递的参数是需要删除的产品,则可以简化此过程。同样的逻辑也适用于第一个函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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);
        }
    }

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


    您需要使用迭代器,否则将得到java.util.ConcurrentModificationException。引发异常,因为您正在列表上执行两个操作:迭代和删除。

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

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

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

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

    注意:由于性能考虑(每一步的二次内存使用和线性删除),我不推荐最后一种方法。我举这个例子只是为了说明为什么抛出JavaUTI.CONCurrTrimeFrimeExtExchange。