题解 | #自动售货系统#

自动售货系统

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;
    }
}

全部评论

相关推荐

我要娶个什么名:学长你电脑闹鬼了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务