应该没什么问题,老师看一下!!
package threehomework; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class GoodsManage { //存放商品Goods的容器Set类型 private Set<Goods> goodsSet = new HashSet<Goods>(); //空构造方法 public GoodsManage() { } //带参构造方法,用于NEW的时候可以给该类进行设置参数 public GoodsManage(Set<Goods> goodsSet) { super(); this.goodsSet = goodsSet; } //创建getter和setter方法,用于取值赋值或者添加一些方法在里面 public Set<Goods> getGoodsSet() { return goodsSet; } public void setGoodsSet(Set<Goods> goodsSet) { this.goodsSet = goodsSet; } //商品信息导入 public void importGoods() { //NEW,GOODS里面的构造创建存储 Goods goods1=new Goods("goods001","水杯",56.0,"不锈钢水杯"); Goods goods2=new Goods("goods002","饮水机",299.0,"带净化功能的饮水机"); Goods goods3=new Goods("goods003","笔记本电脑",4999.0,"15寸笔记本电脑"); Goods goods4=new Goods("goods004","手机",2300.0,"andriod手机"); //使用SET方法将goods类对象添加到集合GoodsManage类中goodsSet容器当中 //由于已经创建了Goods的容器,这里就不用再添加一次了!!! goodsSet.add(goods1); goodsSet.add(goods2); goodsSet.add(goods3); goodsSet.add(goods4); System.out.println("商品信息导入成功"); }; //显示所有商品信息 public void displayAllGoods() { if(goodsSet.size()==0) { System.out.println("商品信息为空,请导入"); }else { Iterator<Goods> it=goodsSet.iterator(); //使用迭代器显示Good类对象的内容 while(it.hasNext()) { System.out.println(it.next()); } } }; }
package threehomework; import java.util.HashMap; //import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.Set; //购物车类 public class ShoppingCart { //创建MAP集合购物车类,用于存储货物信息,String是货物编号,GoodsInCart是货物信息类 public Map<String,GoodsInCart> shoppingCart=new HashMap<>(); //空构造方法 public ShoppingCart() { } //带参构造方法 public ShoppingCart(Map<String, GoodsInCart> shoppingCart) { super(); this.shoppingCart = shoppingCart; } //getter取值/setter设置方法 public Map<String, GoodsInCart> getShoppingCart() { return shoppingCart; } public void setShoppingCart(Map<String, GoodsInCart> shoppingCart) { this.shoppingCart = shoppingCart; }; //定义外部键盘输入和存储数据到MAP集合Key和value的方法 static Scanner sc=new Scanner(System.in); //添加商品到购物车的方法 //将GoodsMange创建对象gm,并创建addGoodsToCart方法,把gm作为数据存储到addGoodsToCart方法中 public void addGoodsToCart(GoodsManage gm) { if(gm.getGoodsSet().size()==0) {//利用GoodsManage对象gm调取getGoodsSet方法再.size来检查是否有内容,goodSet是存储Goods里内容的容器 System.out.println("请先导入数据!"); }else { boolean flag = false; Goods go = null;//用于存储商品类信息 System.out.println("所有的商品信息为:"); gm.displayAllGoods(); System.out.println("请输入想购买的商品编号:"); String goodsId = null; goodsId = sc.next(); //取得goods内容(简写) Set<Goods> goods = gm.getGoodsSet();//把GoodsManage里的GooodSet容器利用gm对象利用Set方法赋值给goods //遍历Goods里的货物信息 for(Goods gInfo:goods) {//遍历goods里面的属性 if(gInfo.getGoodsId().equals(goodsId)) {//如果输入的goodsId和商品信息里的ID一样 flag = true; go = gInfo;//把货物信息存储到go里面 break; } } if(flag==true) {//如果flag判断都为真则输入商品数量 System.out.println("请输入购买商品的数量:"); int num = 0; num = sc.nextInt(); GoodsInCart gic = new GoodsInCart(go, num);//实例化货物信息并存储参数 shoppingCart.put(goodsId, gic);//将key值ID和商品及商品数量存储到shoppingCart的Map集合中 }else { System.out.println("无此商品编号!请重新输入"); } } }; // 显示购物车中的所有商品 public void displayAllInCart() { //创建entrySet方法将shoppingCart的值赋值给set Set<Entry<String, GoodsInCart>> set = shoppingCart.entrySet(); if (set.size() == 0) { System.out.println("您还没有添加任何商品,快去挑选吧"); } else { for (Entry<String, GoodsInCart> entry : set) { System.out.println(entry.getValue().getGood() + "," + entry.getValue().getNum() + "个"); } } } // 修改购物车中商品的数量 public void updateNumInCart() { System.out.println("请输入要修改的商品编号:"); String goodsId=sc.next(); //通过keySet的方法遍历找到ShoppingCart存储的Map数据 Set<String> set=shoppingCart.keySet(); //遍历让shoppingCart的Map集合的值为set,并遍历化得到str for(String str:set) { //如果输入的ID号和shopping里的值相等,则开始修改 if(str.equals(goodsId)) { System.out.println("请输入新的商品数量"); int num = sc.nextInt(); if(num==0) { shoppingCart.remove(str); System.out.println("由于商品数量为零,所以移除该商品。"); }else { shoppingCart.get(str).setNum(num); /*从shoppingCart集合取得已经判断相等的这个ID, 由于shoppingCart包含了GoodsInCart里的num赋值方法,所以利用该方法将键盘输入的num值代入赋值替换*/ // Iterator<GoodsInCart> it=shoppingCart.values().iterator(); // while(it.hasNext()) { // System.out.println(it.next()); // } } }else {//由于不是系统错误,所以这里不用写try...catch System.out.println("购物车中没有该商品!"); } } } //结算 public void settleAccounts() { int sum=0; Set<Entry<String, GoodsInCart>> set = shoppingCart.entrySet(); for (Entry<String, GoodsInCart> entry : set) { sum=(int) (sum+((entry.getValue().getNum())*(entry.getValue().getGood().getPrice()))); } System.out.println("总金额为:"+sum); shoppingCart.clear(); } }
正在回答
您好,在原代码基础上修改如下参考:(结合注释理解)
// 修改购物车中商品的数量 public void updateNumInCart() { if(shoppingCart.size()!=0) {//判断购物车是否存在商品 System.out.println("请输入要修改的商品编号:"); String goodsId=sc.next(); Set<String> set=shoppingCart.keySet(); boolean flag = false;//判断是否存在商品,默认为false for(String str:set) { if(str.equals(goodsId)) { System.out.println("请输入新的商品数量"); int num = sc.nextInt(); if(num==0) { shoppingCart.remove(str); System.out.println("由于商品数量为零,所以移除该商品。"); break;//删除成功后,break语句跳出循环 }else { shoppingCart.get(str).setNum(num); } flag = true;//存在商品,变量为true } } if(flag == false) {//不存在输出提示语句 System.out.println("购物车中没有该商品!"); } }else {//购物车中不存在商品输出提示语句 System.out.println("请添加商品!"); } }
祝学习愉快!
// 修改购物车中商品的数量 public void updateNumInCart() { System.out.println("请输入要修改的商品编号:"); String goodsId=sc.next(); Set<Entry<String, GoodsInCart>> set = shoppingCart.entrySet(); if (set.size() == 0) { System.out.println("您还没有添加任何商品,快去挑选吧"); }else { for(Entry<String,GoodsInCart>entry:set) { if(entry.getValue().getGood().getGoodsId().equals(goodsId)) { if(entry.getValue().getNum()==0) { shoppingCart.remove(entry.getValue().getNum(),entry.getValue().getGood()); System.out.println("由于商品数量为零,所以移除该商品。"); break; }else { System.out.println("请输入新的商品数量"); int num = sc.nextInt(); shoppingCart.get(entry.getValue().getNum()).setNum(num); } } } } }
老师,我对hashMap的remove不理解,而且这里写完判断商品为0也删除不了!应该怎么写才对,还有,修改数量这块也一塌糊涂!请老师帮忙修改一下.
您好,经查看您的代码在作业中老师已经批复,因此在此处给您老师批复的文档:
【修改购物车中的商品数量】
1.修改商品数量时应该先检测购物车是否存在商品,商品不存在则提示用户购物车为空。与显示购物车中的所有商品方法中的判断相同。
2.不存在该商品时循环输出多次提示信息,存在商品时也会输出多次提示信息。
不能在循环中输出提示信息。可以添加一个变量,初始值为false,当在集合中找到商品时,变量值为true。在循环外判断变量为false时,输出提示信息。
3.修改商品数量为0时报错。
在循环遍历过程中删除集合元素。如果删除的刚好是循环的最后一个元素没关系,如果删除后还会继续遍历集合就出问题了。
所以调用完remove()方法,可以使用break语句跳出循环。
【结算】
应先判断购物车中是否存在商品,不存在商品则输出提示语句,存在商品时再进行商品结算。与显示购物车中的所有商品方法中的判断相同。
提交作业之后,老师会进行批改,同学可不再问答区进行提问。祝学习愉快!
package threehomework; import java.util.Scanner; public class TestDemo { //封装菜单信息 public void Menu1() { System.out.println("*********************************"); System.out.println("**主菜单**"); System.out.println("1--商品管理"); System.out.println("2--购物车"); System.out.println("0--退出"); System.out.println("*********************************"); System.out.println("请输入对应的数字进行操作:"); } public void Menu2() { System.out.println("*********************************"); System.out.println("**商品管理**"); System.out.println("1--商品信息导入"); System.out.println("2--显示所有商品信息"); System.out.println("9--返回上一级菜单"); System.out.println("*********************************"); System.out.println("请输入对应的数字对商品进行管理:"); } public void Menu3() { System.out.println("*********************************"); System.out.println("**购物车管理**"); System.out.println("1--添加商品到购物车"); System.out.println("2--修改购物车中的商品数量"); System.out.println("3--显示购物车中的所有商品信息"); System.out.println("4--结算"); System.out.println("9--返回上一级菜单"); System.out.println("**********************************"); System.out.println("请输入对应的数字对购物车进行管理"); } static Scanner input=new Scanner(System.in); public static void main(String[] args) { //定义对象,全局变量 TestDemo test=new TestDemo(); GoodsManage gm=new GoodsManage(); ShoppingCart sc=new ShoppingCart(); boolean flag=true; int n,m = 0; //实现流程 while(flag) { test.Menu1(); try { n=input.nextInt(); } catch (Exception e1) { System.out.println("输入格式错误!请以正确格式输入."); input.next();//!这个消化很重要!!! continue; } //正式操作,键盘输入n,判断读取方法 switch(n) { //栏目:商品管理------------------------------------------------------------ case 1: //为了能用if返回上一级成功必须新建立一个flag1才行 boolean flag1=true; //while里包含菜单,输入,如果输入放在外面就会造成死循环!!!!!必须要记住 while(flag1) { test.Menu2();//菜单 try { m=input.nextInt();//键盘输入 } catch (Exception e) { System.out.println("请以正确格式输入"); input.next(); continue; } //返回 if(m==9) { flag1=false; break; } switch(m) { //商品信息导入 case 1: gm.importGoods(); break; //显示所有内容 case 2: gm.displayAllGoods(); break; default: System.out.println("请输入有效数字!"); } } break; //栏目:购物车------------------------------------------------------------------ case 2: boolean flag2=true; while(flag2) { test.Menu3(); m=input.nextInt(); //返回 if(m==9) { flag1=false; break; } switch(m) { //添加商品到购物车 case 1: sc.addGoodsToCart(gm); break; //修改购物车中的商品数量 case 2: sc.updateNumInCart(); break; //显示购物车中的所有商品信息 case 3: sc.displayAllInCart(); break; //结算 case 4: sc.settleAccounts(); break; default: System.out.println("请输入有效数字!"); } } break; //退出程序 case 0: System.exit(0); System.out.println("欢迎您下次光临"); break; default: System.out.println("请输入有效数字!"); } } } }
第一页:Goods-商品属性页
1)商品属性:商品编号:goodsId,商品名称:goodsName,商品价格:price,商品描述:goodsDesp;
2)创建带参构造方法,用于GoodsManage实例化对象时候将具体数据存入使用.
3)创建getter和setter方法,getter用于其他页面调取具体数据使用,可用于对比数据或者输出数据使用.
4)创建hashCode方法,用于防止重复数据输入,其中public boolean equals(Object obj){}里面的比对数据方法需要重写.
5)创建toString方法,用于将实例化对象导入具体参数数据时候可以显示出使用.
第二页:GoodsManage-商品管理页
1)创建Set<Goods> goodsSet=new HashSet<Goods>();属性,用于存储具体数据的容器使用.
2)创建空构造和带参构造和getter/setter方法,用于ShoppingCart可以调用商品管理页的容器内容及商品属性页面的属性.
3)创建importGoods方法用于导入数据使用,其中使用Goods goods1=new Goods(参数);进行存储具体数据),以及使用Set容器goodsSet.add(Goods对象);存储数据.
4)创建displayAllGoods方法显示全部内容,这里使用判断if容器goodSet.size()==0则商品为空请导入,else使用迭代器Iterator<Goods> it=goodSet.iterator();遍历具体数据,然后使用while循环输出所有it.next内容.
第三页:GoodsInCart-商品信息页
1)属性:Good goods:用于调取商品页中具体属性,商品数量num:用于后面存储商品数量和修改数量.get(str).setNum(num);其中str是ShoppingCart用keySet方法时候遍历的对象.
2)创建空构造和带参构造和getter/setter方法,用于实例化对象把具体的商品数据和商品数量存储进去.
第四页:ShoppingCart-购物车
1)创建public Map<String,GoodsInCart> shoppingCart=new HashMap<>();属性.用于存储商品信息具体内容.
2)创建空构造和带参构造和getter/setter方法,这次编程用不到.
3)创建键盘输入方法static Scanner sc=new Scanner(System.in);
4)创建public void addGoodsToCart(GoodsManage gm)();带参方法用于测试页面把实例化对象gm的具体参数导入进去sc.addGoodsToCart(gm);
没写完,后面继续补充.....
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星