多个类的设计

//package ListTest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //创建饮料屋,传入本饮料屋有什么饮料
        BeverageHouse house = new BeverageHouse(ExamTools.data());
        System.out.print("输入:");
        //接收点单数据,并分解若干对整数,格式看题目说明
        List<int[]> codeAndAmounts = ExamTools.inputCodesAndAmounts();
        //系统依次处理点饮料的请求
        for (int[] codeAndAmount : codeAndAmounts)
            house.order(codeAndAmount[0], codeAndAmount[1]);
        //结算
        house.settle();
    }
}
/**
 * 饮料屋
 * 1 1,2 8,6 3,6 -2,1 1, 2 -100
 */
class BeverageHouse {
    private final Cart cart = new Cart();
    private final BeverageList beverageList;

    public BeverageHouse(Beverage[] beverages) {
        beverageList = new BeverageList(beverages);
    }
    /**
     * 点一种饮料,如果所点的饮料不存在,程序什么也不做
     * @param beverageCode 饮料代码
     * @param amount 点amount杯饮料,可以是负数
     */
    public void order(int beverageCode, int amount) {
        //TODO 补全代码
        Beverage beverage = beverageList.getBeverageByCode(beverageCode);
        if (beverage != null) {
            cart.adjust(beverage, amount);
        }
    }
    /**
     * 模拟结算,输出所购饮料的数量和总价
     */
    public void settle() {
        System.out.printf("总金额:%.2f  总杯数:%d",cart.getTotalPrice(),cart.getTotalAmount());
    }
}
/**
 * 购物车
 */
class Cart {

    /**
     * 增减某种饮料的数量,如果将导致该种饮料点的杯数<=0,表示不要该饮料
     */
    private final HashMap<Beverage,Integer> cart = new HashMap<>();
    public void adjust(Beverage beverage, int amount) {
        //TODO 补全代码
        if(cart.containsKey(beverage)){
            cart.put(beverage,cart.get(beverage)+amount);
        }else{
            cart.put(beverage,amount);
        }
    }
    /**
     * 返回购物车中的饮料总件数
     */
    public int getTotalAmount() {
        //TODO 补全代码
        int sum = 0;
        for (Map.Entry<Beverage, Integer> entry : cart.entrySet()) {
            if(entry.getValue()>0) sum += entry.getValue();
        }
        return sum;
    }
    /**
     * 返回购物车的饮料总价格
     */
    public float getTotalPrice() {
        //TODO 补全代码
        float sum = 0;
        for (Map.Entry<Beverage, Integer> entry : cart.entrySet()) {
            if(entry.getValue()>0&&entry.getKey().getPrice()>0) sum += entry.getKey().getPrice() * entry.getValue();
        }
        return sum;
    }

}
/**
 * 饮料表类
 */
class BeverageList {
    private final Map<Integer, Beverage> beverageMap;

    public BeverageList(Beverage[] beverages) {
        this.beverageMap = new HashMap<>();
        for (Beverage beverage : beverages) {
            this.beverageMap.put(beverage.getCode(), beverage);
        }
    }

    /**
     * 根据饮料代码返回饮料
     * @param beverageCode
     */
    public Beverage getBeverageByCode(int beverageCode) {
        return beverageMap.get(beverageCode);
    }
}
/**
 * 饮料类
 */
class Beverage implements Comparable<Beverage>{
    private final int code;//代码(编号)
    private final String name;//名字
    private final float price;//价格

    public Beverage(int code, String name, float price) {
        this.code = code;
        this.name = name;
        this.price = price;
    }

    public Integer getCode() {
        return code;
    }

    public float getPrice() {
        return price;
    }
    /**
     * code相同的饮料是相同的
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Beverage beverage = (Beverage) o;
        return code == beverage.code;
    }

    @Override
    public int hashCode() {
        return Objects.hash(code);
    }

    /**
     * 各种排序用
     */
    @Override
    public int compareTo(Beverage o) {
        return this.code-o.getCode();
    }

    @Override
    public String toString() {
        return "["+ code +
                "," + name +String.format(",%.2f",price) +
                ']';
    }
}

class ExamTools{

    /**
     * 从键盘接收输入,并按c a,c a ...(c 是饮料代码,a 是数量)的格式解析<br/>
     * 返回的List中每个元素都是一个数组,数组的元素0是饮料代码,元素1是该饮料点几杯<br/>
     */
    static List<int[]> inputCodesAndAmounts() {
        ArrayList<int[]> list = new ArrayList<>();
        String line;
        try (Scanner scanner = new Scanner(System.in)) {
            line = scanner.nextLine();
        }
        String[] codesAndAmounts;
        if (line.matches("^\\+?\\d+\\s+[+-]?\\d+(\\s*,*\\s*\\+?\\d+\\s+[+-]?\\d+)*$")) {
            codesAndAmounts = line.split("[^\\d+-]+");
        } else {
            throw new IllegalArgumentException("error input");
        }
        for (int i = 0; i < codesAndAmounts.length - 1; i += 2) {
            list.add(new int[]{Integer.parseInt(codesAndAmounts[i]),
                    Integer.parseInt(codesAndAmounts[i + 1])});
        }
        return list;
    }

    /**
     * 考试用的测试数据
     */
    static Beverage[] data() {
        return new Beverage[]{
                new Beverage(1, "红茶", 5.55f),
                new Beverage(2, "咖啡", 6.66f),
                new Beverage(3, "奶茶", 8.18f),
                new Beverage(4, "绿茶", 5.32f),
                new Beverage(5, "参茶", 66.6f),
                new Beverage(6, "燕窝", 22.2f),
                new Beverage(7, "梨汁", 7.77f),
                new Beverage(8, "开水", 0.55f),
                new Beverage(9, "橙汁", 4.44f),
                new Beverage(10, "豆浆", 3.43f)
        };
    }
}

  • 16
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万伏小太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值