2011-09-12 11 views
1

私は製品のリストを持っています。このリストにはチェックボックス& qtyが含まれています。ユーザーが選択した特定の製品は、そのオブジェクトをHashSetに保存する必要があります。HashSetの問題 - オブジェクトの保存

CheckBox Name Price Qty 
[]   Pen 21 TextBox 
[]   aaa 11 TextBox 
[]   bbb 25 TextBox 

ユーザーがチェックボックスをオンにして、そのオブジェクトをHashSetに保存すると、

Set<Product> s = new HashSet<Product>(); 
Product product = new Product(); 
product.setName("Pen"); 
product.setPrice(21.00); 
product.setName(10); 
//s.add(product); 
if(!s.add(product)) 
    System.out.println("Duplicate detected : " + product); 
} 

問題は次のとおりです。

私は1つの特定のproduct.After私はその保存された製品の数量を変更していますいくつかの時間を選択しました。 どうすればいいですか:

保存されたオブジェクトを取る方法&一部のプロパティを変更します&保存しました。

私を助けてください...事前に

おかげ..

答えて

2

あなたのProductクラスにメソッドのカップルを追加することができます。

  • public int getQuantity()
  • void setQuantity(int quantity)

ただし、 HashSetにあるオブジェクトを変更しないでください:削除して新しいオブジェクトを追加する方が安全です。実際には、HashSetにあるオブジェクトを変更すると、そのハッシュ値が変更されます!ここで

はいくつかのコードです:私はフィールドquantityを考慮せずにhashCodeequalsをオーバーライドしてきました

public class Product { 

    String name; 
    double price; 
    int quantity; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public void setPrice(double price) { 
     this.price = price; 
    } 

    public int getQuantity() { 
     return quantity; 
    } 

    public void setQuantity(int quantity) { 
     this.quantity = quantity; 
    } 

    @Override 
    public String toString() { 
     return "Product [name=" + name + ", price=" + price + ", quantity=" 
       + quantity + "]"; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     long temp; 
     temp = Double.doubleToLongBits(price); 
     result = prime * result + (int) (temp^(temp >>> 32)); 
     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 (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     if (Double.doubleToLongBits(price) != Double 
       .doubleToLongBits(other.price)) 
      return false; 
     return true; 
    } 

} 

注:

public class Main { 

    public static void main(String[] args) { 
     new Main().go(); 
    } 

    public void go() { 
     Product p1 = new Product(); 
     p1.setName("P1"); 
     p1.setPrice(2.5); 
     p1.setQuantity(1); 

     Product p2 = new Product(); 
     p2.setName("P2"); 
     p2.setPrice(5.3); 
     p2.setQuantity(1); 

     Set<Product> products = new HashSet<Product>(); 
     products.add(p1); 
     products.add(p2); 

     System.out.println(products); 

     // now let's assume that you want to change quantity of P1 

     Product newp1 = new Product(); 
     newp1.setName("P1"); 
     newp1.setPrice(2.5); 
     newp1.setQuantity(2); 

     if (products.contains(newp1)) { 
      products.remove(newp1); 
     } 
     products.add(newp1); 

     System.out.println("after update:"); 
     System.out.println(products); 
    } 

} 

、ここではProductクラスです。より良い選択肢は、ProductnamepriceProductOrderは2つのフィールド:Productquantityの2つのクラスを持つことができます。

+0

これらのセッターとgetter.egを追加しました。 addd(製品);その後、私はそのオブジェクトを取得し、変更して&もう一度保存したい...それを行う方法? – Piraba

+0

しないでください:古いオブジェクトをセットから削除し、新しいオブジェクトを追加してください。これはより安全です。セット内のオブジェクトを変更すると、そのハッシュコードが変更されるためです。 – MarcoS

1

あなたのセットからオブジェクトへの参照を取得し、そのオブジェクトによって公開されているメソッドを使用してその値を変更し、次の取得で更新されたオブジェクトが得られます。 オーバーライドした場合は、商品クラスのequals()メソッドとhashcode()メソッドも投稿できますか?

ので、このような何か:

//set.add(savedProduct); 
//savedProduct.setQuantity(newQuantity); 
//now the product saved in the set has the new quantity. 

ですから、に戻って何かを保存する必要はありませんだけで、オブジェクトへの参照を取得し、参照を使用してオブジェクトを変更します。

+0

はい。それを行うには大丈夫です。しかし、保存されたオブジェクトの参照を取得する方法... – Piraba

+0

したがって、オブジェクトを持っている場合、それを変更したいです。それがセットに存在するかどうかを確認して修正して、再度保存する必要はありません。また、オブジェクト参照がない場合は、セットを反復処理し、各エレメントに検索パラメータを適用する必要がありますiteratedProduct.getProductName()= "searchedName"およびiteratedProduct.getProductName()= oldQuantityの場合、iteratedProduct.setQuantity(newQuantity);) – Scorpion

0

HashSetにはgetterメソッドがありません。イテレータを取得してから、探しているものを見つけて変更してから追加しなければなりません。

それではイテレータを取得:Setインタフェースを使用している間

Product p; 
while(itr.hasNext()){ 
    p = itr.next(); 
    if(p.equals(name) { 
     itr.remove(); 
     //do stuff to it; 
     s.add(p); 
     break; 
    } 
} 

は..あなたは、などそれを見つけていない場合には

0

をいくつかのクリーンアップを行い、まっすぐ進む方法が書くことです検索メソッドを使用して、セットのすべての要素を反復し、指定された商品名を検索します。「ペン」と言います。次に、検索した商品に数量を設定することができます。この方法で、要素をセットに戻す必要はありません。

1

これにはMAPを使用する方が簡単ですか?製品名をキーとして使用し、コレクションから名前でProductオブジェクトを取得するだけで済みます。

Map<String, Product> products = new HashMap<String, Product>(); 

public void addProduct(Product product){ 
    if(products.get(product.getName())!=null){ 
    products.get(product.getName()).addQuantity(product.getQuantity()); 
    }else{ 
     products.put(product.getName(), product); 
    } 
    } 

このソリューションでは、製品名が一意である必要があります。 2つの製品の名前が同じ場合は、一意の名前を適用するか、固有の製品にフィールドを追加するまで、この名前を使用できません。

関連する問題