2011-07-18 12 views
0

要素をarraylistに追加するメソッドがあります 私の仕事は、新しい製品 を同じIDの製品リストに追加できないようにaddProductメソッドを修正することです既存のものとして 要素をarraylistに追加して番号がすでに存在するかどうかをテストします

数字と文字列の両方が同じ単語「アイテム」にあり、同じインデックスに格納されているので、どのようにして数字を取得できるのか分かりません。番号が既に存在するかどうかを調べるための番号が必要です

私はこれをどうしたらよいですか?

私はArrayListに追加する方法は以下のようである:

(new Product(132, "Clock Radio")) 

public void addProduct(Product item) 
{ 
stock.add(item); 
} 
+0

Ummm ...そのコードは有効なjavaではありません。再試行する。 –

+0

@radderは、 'ストック'のタイプをSetに変更するために開いていますか?これはあなたの問題を解決します。 – Santosh

+0

メンバーが含まれていて、特定のメンバーにアクセスする方法がわからない、タイプがProductのオブジェクトがあることを意味しますか? –

答えて

4

私は大いにaddProduct()メソッド内Setのために行くことをお勧めします。 Javadoc、

SET
重複要素のないコレクションから

。より公式には、 には、e1.equals(e2)、および の要素が1つのみであるような要素e1とe2のペアが含まれていません。

、このように私はjava.util.Setを使用する

public static boolean checkDuplicate(ArrayList list) { 
HashSet set = new HashSet(); 
for (int i = 0; i < list.size(); i++) { 
    boolean val = set.add(list.get(i)); 
    if (val == false) { 
    return val; 
    } 
} 
return true; 
} 
+0

Downvoter。コメントしてください。 –

+0

質問には答えません: "数字と文字列の両方が"アイテム "という同じ単語にあり、同じインデックスに格納されているので、どうやって数字を取得できるのか分かりません。"また、他の場所では適切でないかもしれない方法で、 "equals"と "hashCode"を実装する必要があります。そして、あなたは挿入命令を失います。 – Thilo

+0

アイテムを追加するたびに毎回反復することは、コレクションが成長するにつれてコストがかかることがあります。 – Santosh

1
public void addProduct(Product item){ 
    for (Product p: stock) 
     if (p.getId() == item.getId()) 
     return; 
    stock.add(item); 
} 
+0

私は2番目のarraylistを使って商品アイテムを追加してからそれをループして番号を取得しようとしますが、同じ問題が再発してしまいます。番号を取得できません。しかし – radder

1

を実装します。コンストラクタに渡される2つのフィールドに基づいて、Productクラスのequals()メソッドとhashcode()メソッドを実装する必要があります。

+0

は、ちょうど当てはまる場合にequalsとhashCodeを実装することによる潜在的な副作用について注意してください。すべての状況でIDだけに基づいて製品を均等と見なすべきかどうかは誰に分かりますか。 – Thilo

1

IDをキーに、アイテムを値としてHashMapを使用してみてください。 HashMapでは、同じキーで重複した項目を読み込むことができないため、プログラミングの最後に問題が解決されます。 :)

+0

その方法では、挿入順序を失うことになります。 – Thilo

+1

@ThiloはLinkedHashMapではありません –

+0

LinkedHashMapはうまくいくでしょう。しかし、OPがデータ構造を変更できるかどうかは不明である。彼の仕事は、idがまだ存在しない場合、ArrayListに追加することです。 – Thilo

0

ArrayListフィールドと、追加されたIDを追跡するように設定された整数を持つProductListクラスを作成します。アイテムを追加するときに、セットにアイテムのIDがすでに含まれているかどうかを確認します。そうでない場合は、ArrayListに項目を追加します。したがって、これは基本的にArrayListの周りをきちんとラップします。ここで私はそれを行うだろうかです:あなたはその後、自分の他のクラスで

ProductList stock = new ProductList(); 

stock.addProduct(Product item);を使用することができます

public class ProductList{ 
... 
    private ArrayList<Product> list = new ArrayList<Product>(); 
    private Set<Integer> ids = new Set<Integer>(); 
... 
    public void addProduct(Product product){ 
     if(!ids.contains(product.getID())){ 
      list.add(product); 
      ids.add(product.getID()); 
      } 
     } 

    public Product removeProduct(Product product){ 
     if(!list.contains(product)) return null; 
     ids.remove(product.getID()); 
     return list.remove(product); 
     } 
... 
    } 

リストを非常に幅広く使用すると思われる場合は、データフィールドと統合するための実用的なコンストラクタを作成することも非常に便利です。

これは抽象化の観点から非常に優れたアプローチですが、それを実行する最も効率的な方法ではないでしょう。

+0

Setの代わりに別のArrayListも同様に機能します。 – rtheunissen

+0

私は 'if(list.contains(product){}'を使ってみましたが動作しません。私の製品はリストと同じものになりますが、 'else'もしも誰かが考えているのであれば、私は知りたいのですが、代わりにforループの負荷をかけなければならないのです。 – alsobubbly

+0

@alsobubblyどのようなタイプのオブジェクトが 'product'ですか? 'object'クラスの一部である' equals'メソッドをオーバーライドすることができますこれは 'product'が実際に別のものと等しいときを定義する' contains'メソッドは 'equals'メソッドを呼び出します私が思うリストの各製品のメソッド。あなたが好きな場合は、ショットを返して、報告してください。 もっと読むことができます: [java in equals methods](http://stackoverflow.com/q/15175109/) 828867) http://www.artima.com/lejava/articles/equality.html – rtheunissen

関連する問題