亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

時隔一年,再次嘗試實現一下,一年后再來看看是否有所長進。。。

  • 類圖

    http://img1.sycdn.imooc.com/5f9668120001110b07800809.jpg


  • 演示效果:

    http://img1.sycdn.imooc.com/5f966cad0001ccaf06590783.jpg

  • 源代碼

    • Car

/**
?*?車的基類,封裝通用屬性
?*/
public?class?Car?{?//定義父類
????private?int?id;?//編號
????private?String?name;?//名字
????private?float?price;?//價格

????//定義構造方法
????public?Car(int?id,?String?name,?float?price)?{
????????this.id?=?id;
????????this.name?=?name;
????????this.price?=?price;
????}

????public?int?getId()?{
????????return?id;
????}

????public?String?getName()?{
????????return?name;
????}

????public?float?getPrice()?{
????????return?price;
????}
}


  • CargoCapacity

/**
?*?載貨能力接口
?*/
public?interface?CargoCapacity?{
????//?獲取載貨量
????float?getWeight();
}
  • MannedCapacity

/**
?*?載人能力接口
?*/
public?interface?MannedCapacity?{
????//?獲取載人數
????int?getNumber();
}
  • CargoCar

/**
?*?載貨汽車
?*/
public?class?CargoCar?extends?Car?implements?CargoCapacity?{
????private?float?weight;?//?載貨量

????public?CargoCar(int?id,?String?name,?float?price,?float?weight)?{
????????super(id,?name,?price);
????????this.weight?=?weight;
????}

????@Override
????public?float?getWeight()?{
????????return?this.weight;
????}

????@Override
????public?String?toString()?{
????????return?this.getId()?+?"\t"?+?this.getName()?+?"\t?"?+?this.getPrice()?+?"元/天\t載貨:"?+?getWeight()?+?"噸";
????}
}
  • MannedCar

/**
?*?載人汽車
?*/
public?class?MannedCar?extends?Car?implements?MannedCapacity?{
????private?int?number;?//?載人數

????public?MannedCar(int?id,?String?name,?float?price,?int?number)?{
????????super(id,?name,?price);
????????this.number?=?number;
????}

????@Override
????public?int?getNumber()?{
????????return?this.number;
????}

????@Override
????public?String?toString()?{
????????return?this.getId()?+?"\t"?+?this.getName()?+?"\t?"?+?this.getPrice()?+?"元/天\t載人:"?+?this.getNumber()?+?"人";
????}
}
  • MannedCargoCar

/**
?*?可同時載人和載貨的汽車
?*/
public?class?MannedCargoCar?extends?Car?implements?MannedCapacity,?CargoCapacity?{

????private?int?number;?//?裁人數
????private?float?weight;?//?載貨數

????public?MannedCargoCar(int?id,?String?name,?float?price,?int?number,?float?weight)?{
????????super(id,?name,?price);
????????this.number?=?number;
????????this.weight?=?weight;
????}

????@Override
????public?int?getNumber()?{
????????return?this.number;
????}

????@Override
????public?float?getWeight()?{
????????return?this.weight;
????}

????@Override
????public?String?toString()?{
????????return?this.getId()?+?"\t"?+?this.getName()?+?"\t?"?+?this.getPrice()?+?"元/天\t載人:"?+?getNumber()?+?"人\t載貨:"?+?getWeight()?+?"噸";
????}

}
  • CarManager

import?java.util.ArrayList;
import?java.util.List;

/**
?*?Car管理類
?*/
public?class?CarManager?{

????private?List<Car>?cars?=?new?ArrayList<>();

????public?CarManager()?{
????????init();
????}

????//初始化Car集合
????private?void?init()?{
????????add(new?MannedCar(getCarId(),?"奧迪A4",?500,?4));
????????add(new?MannedCar(getCarId(),?"馬自達6",?400,?4));
????????add(new?MannedCargoCar(getCarId(),?"皮卡雪6",?450,?4,?2));
????????add(new?MannedCar(getCarId(),?"金龍",?800,?20));
????????add(new?CargoCar(getCarId(),?"松花江",?400,?4));
????????add(new?CargoCar(getCarId(),?"依維柯",?1000,?20));
????}

????public?void?add(Car?car)?{
????????cars.add(car);
????}

????//菜單顯示
????public?void?showMenu()?{
????????System.out.println("========可租車的類型及其價目表========");
????????System.out.println("序號\t"?+?"汽車名稱???"?+?"租金\t\t??"?+?"容量");
????????cars.forEach(System.out::println);
????}

????public?Car?get(int?index)?{
????????return?cars.get(index?-?1);
????}

????public?boolean?hasIndex(Integer?carId)?{
????????return?carId?>?0?&&?carId?<=?cars.size();
????}

????private?int?getCarId()?{
????????return?cars.size()?+?1;
????}
}
  • RentalItem

/**
?*?租賃項,每選擇租賃一種車都對應一個RentalItem
?*/
public?class?RentalItem?{
????private?Integer?id;
????private?Car?car;?//?租賃的汽車
????private?Integer?days;?//?租賃天數
????private?Integer?quantity;?//?租賃數量

????public?RentalItem(Car?car,?Integer?days,?Integer?quantity)?{
????????this.car?=?car;
????????this.days?=?days;
????????this.quantity?=?quantity;
????????this.id?=?car.getId();
????}

????public?float?getRent()?{
????????return?this.car.getPrice()?*?this.days?*?this.quantity;
????}

????public?int?getNumber()?{
????????if?(isMannedCar())?{
????????????return?((MannedCapacity)?car).getNumber();
????????}
????????return?0;
????}

????public?float?getWeight()?{
????????if?(isCargoCar())?{
????????????return?((CargoCapacity)?car).getWeight();
????????}
????????return?0;
????}

????public?boolean?isMannedCar()?{
????????return?car?instanceof?MannedCapacity;
????}

????public?boolean?isCargoCar()?{
????????return?car?instanceof?CargoCapacity;
????}

????public?String?getName()?{
????????return?car.getName();
????}

????public?Integer?getId()?{
????????return?id;
????}

????public?void?setDays(Integer?days)?{
????????this.days?=?days;
????}

????public?void?setQuantity(Integer?quantity)?{
????????this.quantity?=?quantity;
????}

????public?Integer?getDays()?{
????????return?days;
????}

????public?Integer?getQuantity()?{
????????return?quantity;
????}
}
  • RentalBill

import?java.util.HashMap;
import?java.util.List;
import?java.util.Map;
import?java.util.function.Function;
import?java.util.stream.Collectors;

/**
?*?租賃清單
?*/
public?class?RentalBill?{

????private?Map<Integer,?RentalItem>?itemMap?=?new?HashMap<>();

????public?void?add(RentalItem?item)?{
????????if?(itemMap.containsKey(item.getId()))?{
????????????RentalItem?existItem?=?itemMap.get(item.getId());
????????????existItem.setDays(existItem.getDays()?+?item.getDays());
????????????existItem.setQuantity(existItem.getQuantity()?+?item.getQuantity());
????????}?else?{
????????????itemMap.put(item.getId(),?item);
????????}
????}

????public?void?showBill()?{
????????System.out.println("=============您的賬單=============");
????????System.out.println("***可載人的車有:"?+?"\n\t"?+?mannedCarNames()?+?"?共載人:"?+?totalNumber()?+?"人");
????????System.out.println("***可載貨的車有:"?+?"\n\t"?+?cargoCarNames()?+?"?共載貨:"?+?totalWeight()?+?"噸");
????????System.out.println("***租車總價格:"?+?totalRent()?+?"元");
????}

????private?List<String>?mannedCarNames()?{
????????return?getCarNames(RentalItem::isMannedCar);
????}

????private?List<String>?cargoCarNames()?{
????????return?getCarNames(RentalItem::isCargoCar);
????}

????private?List<String>?getCarNames(Function<RentalItem,?Boolean>?condition)?{
????????return?itemMap.values().stream().filter(item?->?condition.apply(item)).map(RentalItem::getName).collect(Collectors.toList());
????}

????private?Integer?totalNumber()?{
????????return?itemMap.values().stream().filter(RentalItem::isMannedCar).map(RentalItem::getNumber).reduce(Integer::sum).get();
????}

????private?Float?totalWeight()?{
????????return?itemMap.values().stream().filter(RentalItem::isCargoCar).map(RentalItem::getWeight).reduce(Float::sum).get();
????}

????private?Float?totalRent()?{
????????return?itemMap.values().stream().map(RentalItem::getRent).reduce(0f,?(sum,?rent)?->?sum?+=?rent);
????}

}
  • CarRentalSystem

import?java.util.Scanner;
import?java.util.function.Function;

/**
?*?租車系統
?*/
public?class?CarRentalSystem?{
????private?Scanner?scanner?=?new?Scanner(System.in);
????private?RentalBill?rentalBill?=?new?RentalBill();
????private?CarManager?carManager?=?new?CarManager();

????public?void?launch()?{
????????System.out.println("歡迎使用答答租車系統:");

????????if?(goOn())?{
????????????showMenu();
????????????collectRentalItems();
????????????showBill();
????????}?else?{
????????????System.out.println("謝謝使用!客官慢走!");
????????}
????}

????/**
?????*?顯示菜單
?????*/
????private?void?showMenu()?{
????????carManager.showMenu();
????}

????/**
?????*?顯示租賃清單
?????*/
????private?void?showBill()?{
????????rentalBill.showBill();
????}

????/**
?????*?收集用戶選擇的租賃信息
?????*/
????private?void?collectRentalItems()?{
????????while?(true)?{
????????????//?獲取車輛序號
????????????int?carId?=?getInputCarId();
????????????Car?car?=?carManager.get(carId);
????????????//?獲取租賃數量
????????????int?quantity?=?getInputQuantity(car.getName());
????????????//?獲取租賃天數
????????????int?days?=?getInputDays(car.getName());

????????????rentalBill.add(new?RentalItem(car,?days,?quantity));

????????????System.out.print("是否選擇繼續租賃操作?(n:退出,并打印租賃清單;其他任意鍵繼續):");
????????????String?input?=?scanner.next();
????????????if?("N".equalsIgnoreCase(input.trim()))?{
????????????????break;
????????????}
????????}
????}

????private?boolean?goOn()?{
????????int?key?=?getInput("您是否要租車?(1是?0否):",?input?->?{
????????????if?(input?!=?0?&&?input?!=?1)?{
????????????????System.out.println("請輸入數字1或0!");
????????????????return?false;
????????????}
????????????return?true;
????????});
????????return?key?==?1;
????}

????private?int?getInputDays(String?name)?{
????????return?getInput("請輸入["+name+"]的租賃天數:",?days?->?{
????????????if?(days?<?1)?{
????????????????System.out.println("不合法的租賃天數,請重新輸入!");
????????????????return?false;
????????????}
????????????return?true;
????????});
????}

????private?int?getInputQuantity(String?name)?{
????????return?getInput("請輸入["+name+"]的租賃數量:",?quantity?->?{
????????????if?(quantity?<?1?)?{
????????????????System.out.println("不合法的租賃數量,請重新輸入!");
????????????????return?false;
????????????}
????????????return?true;
????????});
????}

????private?int?getInputCarId()?{
????????return?getInput("請輸入要租賃的車輛序號:",?carId?->?{
????????????if?(!carManager.hasIndex(carId))?{
????????????????System.out.println("不合法的車輛序號,請重新輸入!");
????????????????return?false;
????????????}
????????????return?true;
????????});
????}

????/**
?????*?從控制臺接受用戶輸入的一個正整數
?????*
?????*?@param?hint?????提示信息
?????*?@param?function?用戶判斷用戶輸入的信息是否合法,如果不合法,需要重新輸入
?????*?@return
?????*/
????private?int?getInput(String?hint,?Function<Integer,?Boolean>?function)?{
????????while?(true)?{
????????????System.out.print(hint);
????????????try?{
????????????????int?input?=?scanner.nextInt();
????????????????if?(!function.apply(input))?{
????????????????????continue;
????????????????}
????????????????return?input;
????????????}?catch?(Exception?e)?{
????????????????System.out.println("輸入不合法!請重新輸入!");
????????????????//?如果出現異常,則跳過本次輸入的信息
????????????????scanner?=?scanner.skip(".*");
????????????}
????????}
????}
}
  • Test

/**
?*?啟動類
?*/
public?class?Test?{
????public?static?void?main(String[]?args)?{
????????new?CarRentalSystem().launch();
????}
}


正在回答

1 回答

類圖用什么畫的?

0 回復 有任何疑惑可以回復我~
#1

慕圣0830664 提問者

PlantUML
2021-02-06 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

時隔一年,再次嘗試實現一下,一年后再來看看是否有所長進。。。

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號