1. 程式人生 > 實用技巧 >Java的列舉簡單應用

Java的列舉簡單應用

/**
* 請用列舉方式實現如下應用:
* 客戶去旅店住房,
* 客戶分普通客戶,和vip客戶,vip分白金和鑽石客戶
* 不同的客戶有不同的折扣
* 入住的房間分單人房,雙人房和套房
* 不同的房間房費不同
* 入住的時間分一週七天,每天費用也不同
* 請設計程式碼實現某客戶住房一天,計算出應付房費.
* 完成的同學可以嘗試計算連續N天的房費如何計算
**/

根據題意客戶有普通客戶,白金客戶,鑽石客戶,則可以建一個列舉類,內容如下:
 1 public enum Customer {
 2     common("普通", 0),
 3     WhiteGold("白金", 0.8),
 4     diamond("鑽石", 0.9);
5 private String name; 6 private double discount; 7 8 Customer(String name, double discount) { 9 this.name = name; 10 this.discount = discount; 11 } 12 13 public String getName() { 14 return name; 15 } 16 17 public void setName(String name) {
18 this.name = name; 19 } 20 21 public double getDiscount() { 22 return discount; 23 } 24 25 public void setDiscount(double discount) { 26 this.discount = discount; 27 } 28 }

之後是一週每一天也有不同價格折扣

 1 public enum Week {
 2     DAY1("週一", 0.9),
 3     DAY2("週二", 0.9),
4 DAY3("週三", 0.8), 5 DAY4("週四", 0.8), 6 DAY5("週五", 0.5), 7 DAY6("週六", 0.6), 8 DAY7("週日", 0.6); 9 10 private String name;//獲取每週的名字 11 private double per; 12 13 Week(String name, double per) { 14 this.name = name; 15 this.per = per; 16 } 17 18 public String getName() { 19 return name; 20 } 21 22 public void setName(String name) { 23 this.name = name; 24 } 25 26 27 public double getPer() { 28 return per; 29 } 30 31 public void setPer(double per) { 32 this.per = per; 33 } 34 }

房間也有單人房間、雙人房間和套房

 1 public enum Room {
 2     SINGLE("單人房間", 100),
 3     DUETBED("雙人房間", 150),
 4     SUITE("套房", 180);
 5     private String roomName;
 6     private int f;
 7 
 8     Room(String roomName, int f) {
 9         this.roomName = roomName;
10         this.f = f;
11     }
12 
13     public String getRoomName() {
14         return roomName;
15     }
16 
17     public void setRoomName(String roomName) {
18         this.roomName = roomName;
19     }
20 
21     public int getF() {
22         return f;
23     }
24 
25     public void setF(int f) {
26         this.f = f;
27     }
28 }

如果是住一天的話,呼叫getPrice方法,傳來星期、顧客以及房間等級並將對應的價格累加。

 1 public class Util {
 2     private static Week wk;
 3     private static Customer customer;
 4     private static Room room;
 5 
 6     static double total = 0;
 7 
 8     /**
 9      * 客戶住一天
10      *
11      * @param week
12      * @param customer 顧客
13      * @param room     房間類別
14      */
15     public static void getPrice(Week week, Customer customer, Room room) {
16         if (customer != Customer.common) {
17             total = (room.getF() * week.getPer() * customer.getDiscount());
18         } else {
19             total = (room.getF() * week.getPer());
20         }
21         System.out.println("客戶型別:" + customer.getName() +
22                 "\n======================\n" +
23                 "日期:" + week.getName() + "\n" +
24                 "今日折扣:" + week.getPer() + "\n" +
25                 "房間型別:" + room.getRoomName() + "\n"
26                 + "房間價格:" + room.getF() + "元");
27         System.out.println("房價;" + total + "元");
28     }

如果是連續住N天,就要考慮一個問題,就是星期的天數的控制,如果天數大於星期天則星期要從星期一開始算起,下面程式碼我使用index變數來記錄傳來的星期引數並通過If判斷後賦值,並將Week的每一天新增到ArrayList裡,通過迴圈訪問呢ArrayList獲取每一天的金額並計算,使用一個money陣列來統計每一天的金額最後通過for迴圈進行累加輸出。

 1  /**
 2      * 住N天
 3      *
 4      * @param week     星期
 5      * @param customer 顧客
 6      * @param room     房間型別
 7      * @param day      住的天數
 8      */
 9     public static void getPrice(Week week, Customer customer, Room room, int day) {
10         ArrayList<Week> weeks = new ArrayList<>();
11         int index = 0;//記錄陣列下標
12         total = 0;//總金額置為0
13         double money[] = new double[day]; //用來存放每天使用者的費用
14         if (week == wk.DAY1) {
15             index = 0;
16         } else if (week == wk.DAY2) {
17             index = 1;
18         } else if (week == wk.DAY3) {
19             index = 2;
20         } else if (week == wk.DAY4) {
21             index = 3;
22         } else if (week == wk.DAY5) {
23             index = 4;
24         } else if (week == wk.DAY6) {
25             index = 5;
26         } else if (week == wk.DAY7) {
27             index = 6;
28         }
29 
30         weeks.add(wk.DAY1);
31         weeks.add(wk.DAY2);
32         weeks.add(wk.DAY3);
33         weeks.add(wk.DAY4);
34         weeks.add(wk.DAY5);
35         weeks.add(wk.DAY6);
36         weeks.add(wk.DAY7);
37 
38         for (int i = 0; i < day; i++) {
39             if (index > 6) { //如果星期(ArrayList下標)>6
40                 index = 0;//重新回到星期一
41             }
42             //將每天的費用加到money數組裡
43             money[i] = (weeks.get(index).getPer() * customer.getDiscount() * room.getF());
44             index++;
45         }
46 
47         //累加money數組裡的金額
48         for (int i = 0; i < day; i++) {
49             total += money[i];
50         }
51 
52         System.out.println("客戶型別:" + customer.getName() +
53                 "\n===================\n"
54                 + "住" + day + "天");
55         System.out.println("房價共;" + total + "元");
56     }
57 }

主程式測試如下,可以預設住一天,也可以通過Util的getPrice住N天。

 1 public class Water {
 2     public static void main(String[] args) {
 3         Week wk = Week.DAY5; //星期3
 4         Customer customer = Customer.diamond; //鑽石客戶
 5         Room room = Room.DUETBED; //雙人房間
 6 
 7         //預設住1天
 8         Util.getPrice(wk, customer, room);
 9         System.out.println("\n===========================================\n");
10         //住N天
11         Util.getPrice(wk, customer, room, 3);
12     }
13 }

執行效果如下: