题解 | #自动售货系统#

自动售货系统

https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf

import java.lang.reflect.Array;
import java.util.*;
//一步一步处理,根据输出的先后关系
class Machine{
    int remains;//售货机当前剩余的钱币
    Map<String, int[]> goods = new LinkedHashMap<>(); //value值为{数量,单价}
    Map<Integer, Integer> moneys = new LinkedHashMap<>();
    Machine(){};

    public int getRemains() {
        return remains;
    }

    public void setRemains(int remains) {
        this.remains = remains;
    }

    Machine(String[] init){
        String[] goodsString = init[0].split("-");
        String[] moneyString = init[1].split("-");

        remains = 0;
        int[] prices = {2,3,4,5,8,6};
        int[] value = {1,2,5,10};
        for(int i=0 ; i<goodsString.length ; ++i){
            String name = "A"+(i+1);
            goods.put(name, new int[]{Integer.valueOf(goodsString[i]), prices[i]});
        }
        for(int i=0 ; i<moneyString.length ; ++i){
            moneys.put(value[i], Integer.valueOf(moneyString[i]));
        }
        System.out.println("S001:Initialization is successful");
    }

    //投币
    void pay(int p){
        if(!moneys.containsKey(p)){
            System.out.println("E002:Denomination error");
            return ;
        }
        if(p > 2){
            int remainOT = moneys.get(1)+moneys.get(2)*2;
            if(remainOT < p){
                System.out.println("E003:Change is not enough, pay fail");
                return ;
            }
        }
        int goodsSum=0;
        for(String good : goods.keySet()){
            goodsSum+=goods.get(good)[0];
        }
        if(goodsSum==0){
            System.out.println("E005:All the goods sold out");
            return ;
        }
        else{
            remains+=p;
            moneys.put(p, moneys.get(p)+1); //增加售货机该类钱币的张数
            System.out.println("S002:Pay success,balance="+remains);
        }
    }

    //购买商品
    void buy(String goodName){
        if(!goods.containsKey(goodName)){
            System.out.println("E006:Goods does not exist");
            return ;
        }
        if(goods.get(goodName)[0] == 0){
            System.out.println("E007:The goods sold out");
            return ;
        }
        if(remains < goods.get(goodName)[1]){
            System.out.println("E008:Lack of balance");
            return ;
        }
        else{
            remains-=goods.get(goodName)[1];
            System.out.println("S003:Buy success,balance="+remains);
            return ;
        }
    }



    //退款
    void refund(){
        if(remains == 0){
            System.out.println( "E009:Work failure");
            return;
        }
        if(remains > 0){
            //最少张数退币
            //退币不能多退
            int[] values = {10,5,2,1};
            List<String> list = new ArrayList<>();
            for(int i=0 ; i<values.length ; ++i){
                int x = 0;
                while(remains >= values[i]){
                    if(moneys.get(values[i])>0){
                        ++x; //退一张
                        remains -= values[i];
                        moneys.put(values[i], moneys.get(values[i])-1);
                    }
                }
                list.add(values[i]+" yuan coin number="+ x);
            }
            for(int i=list.size()-1 ; i>=0 ; --i){
                System.out.println(list.get(i));
            }
        }
    }

    //查询
    void query(int q){
        if(q==0){
            List<Map.Entry<String, int[]>> goodsList = new ArrayList<>(goods.entrySet());
            //linkedhashmap和稳定的collections.sort保证符合题目排序要求
            Collections.sort(goodsList, new Comparator<Map.Entry<String, int[]>>() {
                @Override
                public int compare(Map.Entry<String, int[]> o1, Map.Entry<String, int[]> o2) {
                    return o2.getValue()[0] - o1.getValue()[0];
                }
            });
            for(int i=0 ; i<goodsList.size() ; ++i){
                String goodName = (String) goodsList.get(i).getKey();
                System.out.println(goodName+" "+goods.get(goodName)[1]+" "+ goods.get(goodName)[0]);
            }

        }

        else if(q==1){
            for(Integer value:moneys.keySet()){
                System.out.println(value + " yuan coin number="+moneys.get(value));
            }
        }
        else{
            System.out.println("E010:Parameter error");
        }
    }


}
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String order = in.nextLine();
        String[] orders = order.split(";");
        String[] initialize = orders[0].substring(2).split(" ");//去除r字符并且去掉分隔符-
        //System.out.println(Arrays.toString(initialize)); 测试输入
        Machine machine = new Machine(initialize); //先初始化
        //System.out.println(Arrays.toString(orders));

        for(int i=1 ; i<orders.length ; ++i){
            //必须是p 1,如果没有中间的空格,则是错误的输入
            if(orders[i].charAt(0) == 'r'){
                initialize = orders[i].substring(2).split(" ");
                machine = new Machine(initialize);
            }
            else if(orders[i].charAt(0) == 'p'){

                machine.pay(Integer.valueOf(orders[i].substring(2)));
            }
            else if(orders[i].charAt(0) == 'b'){
                machine.buy(orders[i].substring(2));
            }
            else if(orders[i].charAt(0) == 'c'){
                machine.refund();
            }
            else if(orders[i].charAt(0) == 'q'){
                if(orders[i].length() != 3 || !Character.isDigit(orders[i].charAt(2))){
                    System.out.println("E010:Parameter error");
                    continue;
                }
                machine.query(Integer.valueOf(orders[i].substring(2)));
            }
        }
    }
}

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

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