从Arraylist中删除

时间:2013-06-09 05:35:54

标签: java arraylist collections

我想稍微优化代码。所有尝试都是从阵列中删除产品。 当我调用方法deleteProduct(prod.getId())时,它应该删除我先添加的产品。

我可以使用for循环,然后如何删除数组中的产品。 有什么指示吗?

public void deleteProduct(int productId) throws ProductNotFoundException {

    Iterator<Product> it = allProducts.iterator();
    Product p= null;
    int pid = productId;
    int i = 0;

    if (!allProducts.isEmpty()) {
        while(it.hasNext()){
            p= it.next();
            i= allProducts.indexOf(p);
            if (p.getId().equals(productId)){
                i= allProducts.indexOf(p);
                allProducts.remove(i);
                System.out.println("Successfully removed the product " + pid);
                return;
            }
        }
    }   
        throw new ProductNotFoundException ("No Such Product");
}

4 个答案:

答案 0 :(得分:4)

您可以通过调用Iterator#remove

来使用迭代器删除项目
while(it.hasNext()){
    p = it.next();
    if (p.getId().equals(productId)) {
         it.remove();
         System.out.println("Successfully removed the product " + pid);
         return;
    }
}
throw new ProductNotFoundException ("No Such Product");

从评论中,使用for循环来获取迭代器:

for(Iterator<Product> it = allProducts.iterator(); it.haNext(); ) {
    p = it.next();
    if (p.getId().equals(productId)) {
         it.remove();
         System.out.println("Successfully removed the product " + pid);
         return;
    }
}
throw new ProductNotFoundException ("No Such Product");

可能你问如何在增强的for循环中执行此操作?答案是,你不能。但由于增强型for在幕后使用了迭代器,因此while循环方法可以满足您的需求。

答案 1 :(得分:1)

想要使用allProducts.remove(),因为它会使你的迭代器失效。你想调用it.remove(),保证让迭代器有效。不需要任何indexOf。您需要查看迭代器正在做什么:它允许您访问元素。您无需返回并使用indexOf获取它们。

并且,您不需要allProducts.isEmpty(),因为它与hasNext循环中的while文本是多余的。如果allProducts确实为空,则while条件在第一次迭代开始时将为false,并将被跳过。

答案 2 :(得分:1)

我认为您可以将List更改为Map Implementation。如果您使用Map,产品根据产品ID进行映射,则可以使用产品ID直接从Map中删除Map条目。它也更容易检索。

地图可以比循环执行得更好。唯一的情况是要注意内存使用情况。

答案 3 :(得分:1)

为什么首先使用循环只是覆盖产品中的.equal方法 并让你方法deleteProduct方法取一个产品not id作为参数,然后只需调用 allProduct.remove(Product p);

试试这个

package test;

public class Product {


    int id;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Product other = (Product) obj;
        if (id != other.id)
            return false;
        return true;
    }


}

和这个

package test;

import java.awt.List;
import java.util.ArrayList;

public class RemoveProduct {

    /**
     * @param args
     */
    java.util.List<Product> productList=new ArrayList<>();
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }


    public void deleteProduct(Product p)
    {

        productList.remove(p);
    }

}