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ループでこれを行う方法を尋ねているのでしょうか? 答えは、できません。しかし、Enhancedforは舞台裏で反復子を使用するため、whileループ アプローチがニーズに適合します。

于 2013-06-09T05:43:05.627 に答える
1

リストをマップ実装に変更できると思います。製品が製品 ID に対してマップされているマップを使用する場合、製品 ID を使用するだけで、マップからマップ エントリを直接削除できます。また、より簡単に取得できます。

マップは、ループよりもはるかに優れたパフォーマンスを発揮します。唯一のケースは、メモリ使用量に注意することです。

于 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 に答える
1

イテレータが無効になるため、使用したくありません。allProducts.remove()を呼び出したいとしますit.remove()。これは、イテレータを有効のままにすることが保証されています。必要はありませんindexOf。イテレータが何をしているのかを確認する必要があります。要素へのアクセスを提供しています。戻って で取得する必要はありませんindexOf

また、ループ内のテキストallProducts.isEmpty()と重複しているため、必要ありません。が実際に空の場合、条件は最初の繰り返しの開始時に false になり、スキップされます。hasNextwhileallProductswhile

于 2013-06-09T05:41:28.480 に答える