我有产品清单。该清单包含复选框& 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;改变一些财产和救了它。
请帮帮我......
提前致谢..
答案 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
的情况下覆盖了equals
和quantity
。一个更好的选择可能是两个类:Product
只有name
和price
,ProductOrder
有两个字段: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'。然后,您可以在搜索到的产品上设置数量。这样您就不必将元素放回集合中。