HashSet中的问题 - 保存对象

时间:2011-09-12 05:54:57

标签: java

我有产品清单。该清单包含复选框& text-box.IF中的数量用户选择的特定产品需要在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);
}

问题是:

我选择了一个特定的产品。过了一段时间,我正在改变该保存产品的数量。 我们如何做到这一点:

如何拍摄保存的物品&amp;改变一些财产和救了它。

请帮帮我......

提前致谢..

5 个答案:

答案 0 :(得分:2)

您可以为Product课程添加几种方法:

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

但是,您不应该修改HashSet中的对象:删除它并添加新对象会更安全。实际上,如果修改HashSet中的对象,则会修改其哈希值!

以下是一些代码:

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类:

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;
    }

}

请注意,我在不考虑字段hashCode的情况下覆盖了equalsquantity。一个更好的选择可能是两个类:Product只有namepriceProductOrder有两个字段:Product和{{1} }。

答案 1 :(得分:1)

只需从集合中获取对象的引用,使用对象公开的方法修改其值,下一次检索将为您提供更新的对象。 如果你覆盖它们,你还可以发布产品类的equals()和hashcode()方法吗?

这样的事情:

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

因此您无需再保存任何内容,只需获取对象的引用并使用引用修改对象。

答案 2 :(得分: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个产品具有相同的名称,则除非您强制使用唯一名称或向具有唯一性的产品添加字段,否则不能使用此名称

答案 3 :(得分:0)

由于HashSet没有任何getter方法,你必须得到迭代器然后遍历你的集合,直到你找到你正在寻找的那个,更改它然后添加。

然后离开迭代器:

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

做一些清理,以防你没找到等等。

答案 4 :(得分:0)

使用Set界面时,直接的方法是编写一个搜索方法,遍历集合中的所有元素并搜索给定的产品名称'Pen'。然后,您可以在搜索到的产品上设置数量。这样您就不必将元素放回集合中。