0

我想稍微优化一下代码。所有要做的就是从阵列中删除产品。当我调用该方法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

4 回答 4

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循环方法将适合您的需求。

于 2013-06-09T05:43:05.627 回答
1

不想使用allProducts.remove(),因为它会使您的迭代器无效。您想调用it.remove(),这保证使迭代器有效。不需要任何indexOf. 您需要查看迭代器在做什么:它让您可以访问元素。您不必返回并使用indexOf.

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

于 2013-06-09T05:41:28.480 回答
1

我认为您可以将列表更改为地图实现。如果您使用 Map,其中产品与产品 ID 进行映射,您可以仅使用产品 ID 直接从 Map 中删除 Map 条目。它也更容易检索。

地图的性能远优于循环。唯一的情况是注意内存使用。

于 2013-06-09T05:45:11.597 回答
1

为什么你首先使用循环只是覆盖产品中的 .equal 方法并让你方法 deleteProduct 方法将产品而不是 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);
    }

}
于 2013-06-09T06:14:56.283 回答