题解 | #自动售货系统#
自动售货系统
https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
// 存储Good类的信息
static List<Good> goodList = new ArrayList<>();
// 存储MoneyBox类的信息
static List<MoneyBox> mbList = new ArrayList<>();
// 初始化商品总量
static int goodTotal;
// 初始化投币余额
static int moneyTotal;
public static void main(String[] args) {
// 初始化Good类和MoneyBox类
goodList.add(new Good("A1", 2));
goodList.add(new Good("A2", 3));
goodList.add(new Good("A3", 4));
goodList.add(new Good("A4", 5));
goodList.add(new Good("A5", 8));
goodList.add(new Good("A6", 6));
mbList.add(new MoneyBox(1));
mbList.add(new MoneyBox(2));
mbList.add(new MoneyBox(5));
mbList.add(new MoneyBox(10));
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
// int a = in.nextInt();
// int b = in.nextInt();
// System.out.println(a + b);
// 读入一行命令
String commandStr = in.nextLine();
// 根据;进行切割
String[] commandArr = commandStr.split(";");
// 遍历命令
for (int i = 0; i < commandArr.length; i++) {
// 包含r,系统初始化命令
if (commandArr[i].contains("r")) {
// 系统初始化
sysInit(commandArr[i]);
}
// 包含p,投币命令
else if (commandArr[i].contains("p")) {
// 投币命令
insertCoin(commandArr[i]);
}
// 包含b,购买商品的命令
else if (commandArr[i].contains("b")) {
// 购买商品的命令
purchaseGood(commandArr[i]);
}
// 包含c,退币的命令
else if (commandArr[i].contains("c")) {
// 退币的命令
refundCoin(commandArr[i]);
}
// 包含q,查询类别的命令
else if (commandArr[i].contains("q")) {
// 查询类别的命令
findClasses(commandArr[i]);
}
}
}
}
// 查询的类别的命令,0代表查询商品信息,1代表查询存钱盒的信息
public static void findClasses(String str){
// 根据" "切割
String[] commArr = str.split(" ");
// 需要对q命令进行判错
if(!str.contains(" ")){
System.out.println("E010:Parameter error");
return;
}
int sign = Integer.parseInt(commArr[1]);
if(sign<0||sign>1){
System.out.println("E010:Parameter error");
return;
}
// 对goodList集合按照商品数量从大到小排序,商品数量相等,按照商品名称先后排序
Collections.sort(goodList,new Comparator<Good>(){
public int compare(Good o1,Good o2){
if(o1.goodNum==o2.goodNum){
return o1.goodName.compareTo(o2.goodName);
}else{
return o2.goodNum-o1.goodNum;
}
}
});
// 判断是查询商品信息还是存钱盒信息
if(sign==0){
// 查询商品信息
// 遍历goodList集合
for(int m=0;m<goodList.size();m++){
Good good = goodList.get(m);
System.out.println(good.goodName+" "+good.price+" "+good.goodNum);
}
}else{
// 查询存钱盒的信息
// 遍历mbList的集合
for(int n=0;n<mbList.size();n++){
MoneyBox mb= mbList.get(n);
System.out.println(mb.faceVal+" yuan coin number"+mb.moneyNum);
}
}
}
// 退币的命令
public static void refundCoin(String str){
// 判断投币余额是否等于0
if(moneyTotal==0){
// 直接输出
System.out.println("E009:Work failure");
return;
}
// 初始化每个面额的支出数量
int oneNum = 0;
int twoNum=0;
int fiveNum=0;
int tenNum=0;
// 余额大于10且存钱盒还存在10元面额的数量
while(moneyTotal>=10&&mbList.get(3).moneyNum>0){
// 更新余额
moneyTotal-=10;
// 更新10元面额的数量
mbList.get(3).moneyNum-=1;
// 十元面额支出+1
tenNum++;
}
// 余额大于5且存钱盒还存在5元面额的数量
while(moneyTotal>=5&&mbList.get(2).moneyNum>0){
// 更新余额
moneyTotal-=5;
// 更新5元面额的数量
mbList.get(2).moneyNum-=1;
// 5元面额支出+1
fiveNum++;
}
// 余额大于2且存钱盒还存在2元面额的数量
while(moneyTotal>=2&&mbList.get(1).moneyNum>0){
// 更新余额
moneyTotal-=2;
// 更新2元面额的数量
mbList.get(1).moneyNum-=1;
// 2元面额支出+1
twoNum++;
}
// 余额大于1且存钱盒还存在1元面额的数量
while(moneyTotal>=1&&mbList.get(0).moneyNum>0){
// 更新余额
moneyTotal-=1;
// 更新2元面额的数量
mbList.get(0).moneyNum-=1;
// 2元面额支出+1
oneNum++;
}
// 将余额更新为0
moneyTotal=0;
System.out.println("1 yuan coin number="+oneNum);
System.out.println("2 yuan coin number="+twoNum);
System.out.println("5 yuan coin number="+fiveNum);
System.out.println("10 yuan coin number="+tenNum);
}
// 购买商品的命令
public static void purchaseGood(String str){
// 根据" "进行切割
String[] buyComArr = str.split(" ");
// 获取商品名称
String goodName = buyComArr[1];
// 定义开关,初始值false,存在
boolean exist = false;
Good good = null;
// 遍历goodList集合
for(int k=0;k<goodList.size();k++){
// 判断goodName和goodList.get(k).goodName是否相等
if(goodName.equals(goodList.get(k).goodName)){
// 存在,直接输出
exist = true;
// 获取good
good = goodList.get(k);
}
}
// 当flag=true,商品是存在的
if(!exist){
// 不存在,直接输出
System.out.println("E006:Goods does not exist");
return;
}
// 判断所购买的商品数量是否为0
if(good.goodNum==0){
System.out.println("E007:The goods sold out");
return;
}
// 判断投币的余额是否小于商品价格
if(moneyTotal<good.price){
System.out.println("E008:Lack of balance");
return;
}
// 更新投币余额
moneyTotal-=good.price;
System.out.println("S003:Buy success,balance="+moneyTotal);
}
// 投币命令
public static void insertCoin(String str) {
// 根据" "切割,切分出命令,以及值
String[] commArr = str.split(" ");
// 得到投入的面额大小
int faceCoin = Integer.parseInt(commArr[1]);
// 判断faceCoin是否等于1,2,5,10
if (faceCoin != 1 && faceCoin != 2 && faceCoin != 5 && faceCoin != 10) {
// 直接输出异常
System.out.println("E002:Denomination error");
return;
}
// 判断存钱盒中1元和2元的钱币总额是否小于faceCoin
int oneTotal = mbList.get(0).moneyNum;
int twoTotal = mbList.get(1).moneyNum * 2;
if (faceCoin > 2 && (oneTotal + twoTotal) < faceCoin) {
// 是小于,直接输出
System.out.println("E003:Change is not enough, pay fail");
return;
}
// 判断商品是否已被售空,如果售空则投币失败
if (goodTotal == 0) {
System.out.println("E005:All the goods sold out");
}
// 更新投币余额
moneyTotal+=faceCoin;
// 更新存钱盒的面额数量
if(faceCoin==1){
mbList.get(0).moneyNum+=1;
}
else if(faceCoin==2){
mbList.get(1).moneyNum+=1;
}
else if(faceCoin==5){
mbList.get(2).moneyNum+=1;
}else if(faceCoin==10){
mbList.get(3).moneyNum+=1;
}
// 投币成功
System.out.println("S002:Pay success,balance="+moneyTotal);
}
// 系统初始化命令
public static void sysInit(String str) {
// 根据" "切割字符串
String[] strArr = str.split(" ");
// 根据"-"切割,得到商品数量的字符串数组
String[] goodNumArr = strArr[1].split("-");
// 遍历goodNumArr
for (int i = 0; i < goodNumArr.length; i++) {
// 将goodNumArr[i]的值,放入对应的商品的名称
Integer goodNum = Integer.parseInt(goodNumArr[i]);
goodList.get(i).goodNum = goodNum;
// 计算数量总和
goodTotal += goodNum;
}
// 根据"-"切割,得到面额数量的数组
String[] faceNumArr = strArr[2].split("-");
// 遍历faceNumArr
for (int j = 0; j < faceNumArr.length; j++) {
// 将facecNumArr[i]的值,放入对应的面额
Integer faceNum = Integer.parseInt(faceNumArr[j]);
mbList.get(j).moneyNum = faceNum;
}
// 将moneyTotal初始化,在每次初始化后,投币的余额必须恢复为0
moneyTotal = 0;
// 系统初始化成功
System.out.println("S001:Initialization is successful");
}
}
// 商品规格
class Good {
// 商品名称
String goodName;
// 商品价格
Integer price;
// 商品数量
Integer goodNum;
// 构造方法
public Good(String goodName, Integer price) {
this.goodName = goodName;
this.price = price;
}
}
// 存钱盒
class MoneyBox {
// 钱币面额
Integer faceVal;
// 钱币数量
Integer moneyNum;
// 构造器
public MoneyBox(Integer faceVal) {
this.faceVal = faceVal;
}
}

