应该没什么问题,老师看一下!!
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 星