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 |
/ /和
1 2 3 4 5 6 7 8 9 10 11 12 13 |
2个问题:
可能的解决方案:
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。