当前位置:网站首页>多個類的設計

多個類的設計

2022-06-27 08:46:00 萬伏小太陽

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

原网站

版权声明
本文为[萬伏小太陽]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/178/202206270845379201.html