我想稍微优化代码。所有尝试都是从阵列中删除产品。
当我调用方法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");
}
答案 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);
}
}