具体题目:用HashSet模拟一个网上购物车。要求:从键盘输入5个商品的编号、名称、单价、购买数量,将这些信息存入一个HashSet,(如果编号相同,则可以在数量上加1,不能重复存入购物车)然后将该HashSet作为参数调用方法getSum(HashSet items),该方法用于计算商品的总价并返回。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
public class Testa {
/*getSum方法 获得总额*/
public static double getSum(HashSet <Goods> goods) {
double sum=0;
double unitprice=0;
int quantity=0;
/*添加迭代器 获取每一个商品*/
Iterator<Goods> it=goods.iterator();
while(it.hasNext()) {
Goods x=new Goods();
x=it.next();
/*获取总额 商品单价*数量*/
sum+=(x.unitprice*x.quantity);
}
return sum;
}
public static void main(String[]ags) {
HashSet<Goods> gds=new HashSet<Goods>();
Scanner sc=new Scanner(System.in);
int i=0;
/*for循环 获得每一个商品对应的信息*/
for(i=0;i<5;i++) {
Goods goods=new Goods();
System.out.println("请输入商品的编号");
goods.number=sc.next();
System.out.println("请输入商品的名字");
goods.name=sc.next();
System.out.println("请输入商品的单价");
goods.unitprice=sc.nextDouble();
System.out.println("请输入商品的数量");
goods.quantity=sc.nextInt();
gds.add(goods);
}
/*打印总额*/
System.out.println("您一共消费了"+getSum(gds)+"元!");
}
}
class Goods{
String number;
String name;
double unitprice;
int quantity;
//重写hashCode方法
public int hashCode() {
return number.hashCode();
}
//重写equals方法
public boolean equals(Object obj) {
if(this==obj)
return true;
if(!(obj instanceof Goods)) {
return false;
}
Goods goods=(Goods) obj;
boolean b=this.number.equals(goods.number);
/*如果相同 那么数量+1*/
if(b) {
goods.quantity++;
}
return b;
}
}
关于本题我的理解:对于本题首先先要定义商品类,把对应的属性都定义好,然后重写hashcode和equals方法,用来避免同一种商品进入购物车,要注意的是在equals方法中,当是同一种商品的时候,就把这个商品的数量加一。到了设置getSum方法当中,传入的参数是HashSetgood,用迭代器获取每一个商品,再把商品的总和进行相加再返回总和。在主类当中就用键盘输入对应的参数,调用getSum方法,把最后的总和计算出来。
总结以下:
1.为何要同时重写hashcode和equals方法,是因为避免重复的元素进入到这个购物车当中
2.HashSet是一个很好的工具,用来存放对象
3.对于遍历HashSet里面的对象需要用到Iterator<类型> it=goods.iterator();,然后就会把HashSet里面的对象迭代出来,然后再重新定义一个类,用来获取每一个对象goods的具体属性,比如number啊这些因为number,name这些是Goods类才有的属性
4.对于这种 既不想放入HashSet里面,也不想少一个,就比如这个购物车的,就要重写equals方法的时候通过boolean判断,如果是相同的说明是同一个对象,那么再把它的数量+1(具体可以参照上面的题目要求——重复的商品不放入购物车但是要数量+1)