如何保证添加相同的商品的时候,购物车里不会出现两条记录?
答:修改继承自Object类的hashcode()方法和equals()方法,如图,令id和name相同的商品具有相同的hashcode,则在map里看做是相同的键。
@Items.java//解决编号没有合并问题 @Override public int hashCode() { //若getId和getName相同,则hashCode一定相同 return this.getId()+this.getName().hashCode(); } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub if(this==obj) { return true; } if(obj instanceof Items) { Items i = (Items)obj; if(this.getId()==i.getId()&&this.getName().equals(i.getName())) { return true; } else { return false; } } else { return false; } } @Cart.java //添加商品进购物车的方法 public boolean addGoodsInCart(Items item ,int number) { if(goods.containsKey(item))//重复添加,解决数量没有相加问题 { goods.put(item, goods.get(item)+number); } else//第一次添加 { goods.put(item, number); } calTotalPrice(); //重新计算购物车的总金额 return true; }
通过重写Object类hashCode 和equals方法,来修改生成新对象时的规则,如果符合我的规则,那么你new出来的两个对象就是一个对象!
如何解决不重复添加商品进购物车
1、重写items类中的HashCode和equals方法。
也就是重写判断规则
通过重写实体类的 hashCode( ) 和 equals( ) 方法,实现在HashMap中按实际需求判断是否存在
@Items.java//解决编号没有合并问题 @Override public int hashCode() { //若getId和getName相同,则hashCode一定相同 return this.getId()+this.getName().hashCode(); } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub if(this==obj) { return true; } if(obj instanceof Items) { Items i = (Items)obj; if(this.getId()==i.getId()&&this.getName().equals(i.getName())) { return true; } else { return false; } } else { return false; } } @Cart.java //添加商品进购物车的方法 public boolean addGoodsInCart(Items item ,int number) { if(goods.containsKey(item))//重复添加,解决数量没有相加问题 { goods.put(item, goods.get(item)+number); } else//第一次添加 { goods.put(item, number); } calTotalPrice(); //重新计算购物车的总金额 return true; }
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
但是instanceof在Java的编译状态和运行状态是有区别的:
在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。
如何保证不添加重复商品入购物车
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
但是instanceof在Java的编译状态和运行状态是有区别的:
在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。
@JavaWeb---不添加重复商品
@Override public int hashCode() { //若getId和getName相同,则hashCode一定相同 return this.getId()+this.getName().hashCode(); } @Override public boolean equals(Object obj) { if(this==obj){ return true; } if(obj instanceof Items){ Items i = (Items)obj; if(this.getId()==i.getId()&&this.getName().equals(i.getName())){ return true; }else{ return false; } }else{ return false; } }
重写equal方法判断是否相等
我的关于添加商品不重复的方法,直接改添加商品的函数就行了
public boolean addGoodsInCart(Items item,int number)
{
boolean ishave = false;
Set<Items> keys = goods.keySet();//获得键的集合
Iterator<Items> it = keys.iterator();//获得迭代器对象
while(it.hasNext())
{
Items i = it.next();
if(i.getName().equals(item.getName()))
{
ishave = true;//说明添加购物车里已有的商品
number += goods.get(i);//获取商品的数量
goods.remove(i);//把原来的商品数据删除
}
}
goods.put(item,number); //添加商品
calTotalPrice();//重新计算购物车的总价格
return true;
}
1.重写hashCode 和equals方法的原因:
通过重写Object类hashCode 和equals方法,来修改生成新对象时的规则,如果符合我的规则,那么你new出来的两个对象就是一个对象,那么后面new出来的相同对象会覆盖前面的已生成的同一对象。
2.java中判断两个对象是否相等的规则:
首先,判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
3.hashmap的put()方法实现原理:
首先hash(key)得到key的hashcode(),hashmap根据获得的hashcode找到要插入的位置所在的链,在这个链里面放的都是hashcode相同的Entry键值对,在找到这个链之后,会通过equals()方法判断是否已经存在要插入的键值对,而这个equals比较的其实就是key。所以这里首先重写hashcode()方法找到相同的链,然后重写equals方法以保证key相同。
@Items.java//解决编号没有合并问题 @Override public int hashCode() { //若getId和getName相同,则hashCode一定相同 return this.getId()+this.getName().hashCode(); } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub if(this==obj) { return true; } if(obj instanceof Items) { Items i = (Items)obj; if(this.getId()==i.getId()&&this.getName().equals(i.getName())) { return true; } else { return false; } } else { return false; } } @Cart.java //添加商品进购物车的方法 public boolean addGoodsInCart(Items item ,int number) { if(goods.containsKey(item))//重复添加,解决数量没有相加问题 { goods.put(item, goods.get(item)+number); } else//第一次添加 { goods.put(item, number); } calTotalPrice(); //重新计算购物车的总金额 return true; }
1.重写hashCode 和equals方法的原因:
通过重写Object类hashCode 和equals方法,来修改生成新对象时的规则,如果符合我的规则,那么你new出来的两个对象就是一个对象,那么后面new出来的相同对象会覆盖前面的已生成的同一对象。
2.java中判断两个对象是否相等的规则:
首先,判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
3.hashmap的put()方法实现原理:
首先hash(key)得到key的hashcode(),hashmap根据获得的hashcode找到要插入的位置所在的链,在这个链里面放的都是hashcode相同的Entry键值对,在找到这个链之后,会通过equals()方法判断是否已经存在要插入的键值对,而这个equals比较的其实就是key。所以这里首先重写hashcode()方法找到相同的链,然后重写equals方法以保证key相同。
//重写equals()和hash Code()
@Override
public boolean equals(Object arg0) {
if(this == arg0) {
return true;
}
if (arg0 instanceof Items ) {
Items items = (Items)arg0;
if(this.getId() == items.getId() && this.getName().equals(items.getName())) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
@Override
public int hashCode() {
return this.getId()+this.getName().hashCode();
}
在商品进购物车的方法中
public boolean addGoodsInCart(Items item,int number)
{
//对添加的item判断是不是同一个item
if(goods.containsKey(item)) {
goods.put(item, goods.get(item)+number);
}
else {
goods.put(item, number);
}
CalTotaPrice();//重新计算的总金额
return true;
}