当前位置:网站首页>多個類的設計
多個類的設計
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)
};
}
}
边栏推荐
- Matlab tips (19) matrix analysis -- principal component analysis
- ServletConfig与ServletContext
- win10为任意文件添加右键菜单
- VIM from dislike to dependence (20) -- global command
- 不会初始化类的几种Case
- 【mysql篇-基础篇】通用语法1
- fastadmin 安装后访问后台提示模块不存在
- Zabbix部署说明(Server+Win客户端+交换机(H3C))
- SIG associé: toutes les routes mènent à ue5
- Analysis of orthofinder lineal homologous proteins and result processing
猜你喜欢
SIG associé: toutes les routes mènent à ue5
關聯GIS:條條道路通UE5城
The markdown plug-in of the browser cannot display the picture
[cloud native] 2.3 kubernetes core practice (Part 1)
Redis的事务
(原创)自定义Drawable
粗读DS-TransUNet: Dual Swin Transformer U-Net for Medical Image Segmentation
Redis transactions
Ready to migrate to the cloud? Please accept this list of migration steps
win10为任意文件添加右键菜单
随机推荐
UE5神通--POI解决方案
CLassLoader
How Oracle converts strings to multiple lines
ZABBIX deployment instructions (server+win client + switch (H3C))
關聯GIS:條條道路通UE5城
ServletConfig and ServletContext
I'm almost addicted to it. I can't sleep! Let a bug fuck me twice!
Lvgl description 3 about the use of lvgl Guide
oracle怎样将字符串转为多行
第十一章 信号(一)- 概念
win10为任意文件添加右键菜单
【云原生】2.3 Kubernetes 核心实战(上)
内部类~锁~访问修饰符
JS EventListener
MySQL环境变量配置的教程
Matlab tips (18) matrix analysis -- entropy weight method
[cloud native] 2.3 kubernetes core practice (Part 1)
使线程释放锁资源的操作/方法重载一点注意事项
Chapter 11 signal (I) - concept
MySQL environment variable configuration tutorial