天天看點

5 使用數組實作酒店房間管理系統

酒店房間管理系統需求

有家酒店一共有5層,每層有10個房間,其中:

1,2層是标準間

3,4層是雙人間

5層是豪華間

根據以前所學習的知識實作一個酒店房間管理系統,需要提供房間狀态檢視,房間預定、退房的功能。

在編寫該系統之前先來學習一個新知識,如何擷取使用者的輸入?

import java.util.Scanner;

public class GetInput {
        public static void main(String[] args){

            Scanner s = new Scanner(System.in);

            //程式執行到此處,會暫停來等待使用者的輸入.
            String userInput = s.next();

            System.out.println("您輸入了:" + userInput);
        }

    }
           

需求分析

先來抽象,既然要做酒店房間管理系統,那麼就會跟酒店和房間打交道,是以将這兩個對象使用Java語言表現出來:

首先需要定義一個Room類,裡面存儲房間編号,房間類型,是否空房

其次需要定義一個Hotel類,裡面存儲所有房間的基本資訊。裡面提供預定、退房、檢視房間狀态的方法。

最後需要定義一個Test類,用來接收使用者的輸入,進而提供房間服務。

編碼實作

定義一個Room類

//酒店的房間
public class Room {
    //房間編号
    private String id;
    //房間類型 标準間 雙人間 豪華間
    private String type; 
    //房間是否被占用  false表示空閑,true表示占用
    private boolean isUse; 

    //無參構造方法
    public Room() {}

    //有參構造方法,用來初始化該類中的屬性值
    public Room(String id, String type, boolean isUse) {
        this.id = id;
        this.type = type;
        this.isUse = isUse;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }

    public boolean isUse() {
        return isUse;
    }
    public void setUse(boolean isUse) {
        this.isUse = isUse;
    }

    //重寫toString方法,直接将房間的基本資訊拼接成字元串傳回
    public String toString(){
        return "["+id+","+type+","+(isUse?"占用":"空閑")+"]";
    }

}
           

定義一個Hotel類

public class Hotel{

    /*
        酒店裡面是一個挨着一個房間,需要将這些房間展現出來,
        酒店中的房間個數是固定的,在Java中數組的長度是固定的,這裡可以使用數組來存儲這些房間對象。
        酒店有多層,是以使用二維數組
        定義房間類型的數組,該數組中用來存儲房間對象
    */
    private Room[][] rooms;

    //無參構造方法,用來初始化房間對象資料
    Hotel() {}

        //酒店的房間是共有5層,每層10個房間
        rooms = new Room[5][10];

        //指派,初始化房間号
        //1,2 标準間:101,102 ... 110,201,202 ... 210
        //3 4 雙人間
        //5 豪華間
        for(int i=0;i<rooms.length;i++){

            for(int j=0;j<rooms[i].length;j++){

                if(i==0 || i==1){
                    rooms[i][j] = new Room(((i+1)*100)+j+1+"","标準間",false);
                }

                if(i==2 || i==3){
                    rooms[i][j] = new Room(((i+1)*100)+j+1+"","雙人間",false);
                }

                if(i==4){
                    rooms[i][j] = new Room(((i+1)*100)+j+1+"","豪華間",false);
                }

            }

        }

    }

    //在使用酒店管理系統時需要檢視每個房間的狀态,是否已被占用
    //對外提供一個列印酒店房間清單的方法
    public void print(){

        for(int i=0;i<rooms.length;i++){

            for(int j=0;j<rooms[i].length;j++){
                System.out.print(rooms[i][j] + "  ");
            }

            System.out.println();

        }

    }

    //當使用者預訂時,需要将房間狀态改為占用
    //對外提供一個預訂酒店的方法
    public void order(String id){

        for(int i=0;i<rooms.length;i++){

            for(int j=0;j<rooms[i].length;j++){
                //根據傳入的房間編号去數組中查找與之對應的房間
                if(rooms[i][j].getId().equals(id)){
                    //将該房間的狀态改成占用
                    rooms[i][j].setUse(true);
                    //此時後面就沒有必要再繼續循環了,是以直接return
                    return;
                }
            }

        }

    }

    //對外提供一個退房酒店的方法
    public void checkOut(String id){

        for(int i=0;i<rooms.length;i++){

            for(int j=0;j<rooms[i].length;j++){
                //根據傳入的房間編号去數組中查找與之對應的房間
                if(rooms[i][j].getId().equals(id)){
                    //将該房間的狀态改成空閑
                    rooms[i][j].setUse(false);
                    //此時後面就沒有必要再繼續循環了,是以直接return
                    return;
                }
            }

        }

    }
}
           

定義一個測試類

import java.util.Scanner;

public class Test{

    public static void main(String[] rags){

        Scanner s = new Scanner(System.in);

        System.out.println("歡迎使用酒店管理系統,酒店房間清單如下所示:");

        //初始化酒店
        Hotel h = new Hotel();

        //輸出房間清單
        h.print();

        while(true){
            System.out.print("請輸入預定或者退房");
            String order = s.next();
            if("預定".equals(order)){
                System.out.print("請輸入預訂房間的編号:");
                String id = s.next();
                //預訂房間
                h.order(id);
            }else if("退房".equals(order)){
                System.out.print("請輸入退房房間的編号:");
                String id = s.next();
                h.checkOut(id);
            }else {
                System.out.print("請輸入預定或者退房");
            }

            //列印酒店清單
            h.print();
        }


    }
}
           

代碼重構

通過上面的代碼就可以完成需求了,但是上面的代碼寫的不夠漂亮,還有一些地方需要改進,下面就來重構一下。

上面代碼中預訂和退房的方法中,代碼邏輯差不多,為了便于維護,可以将之前的兩個方法合并為一個方法。

/**
 * 預訂或退房
 * @param id    房間編号
 * @param isIn  是否預訂     預訂:true,退房:false
 */
public void inOrOut(String id, boolean isIn){

    for(int i=0;i<rooms.length;i++){

        for(int j=0;j<rooms[i].length;j++){
            //根據傳入的房間編号去數組中查找與之對應的房間
            if(rooms[i][j].getId().equals(id)){
                //修改房間狀态
                rooms[i][j].setUse(isIn);
                //此時後面就沒有必要再繼續循環了,是以直接return
                return;
            }
        }

    }

}
           

再來分析:上面的inOrOut方法中需要嵌套兩層for循環,如果資料量較大時可能會影響計算效率,雖然該酒店管理系統不會有大資料量,一般100個房間就算大型酒店了,但是這裡還是給出不使用for循環周遊的解決辦法:

/**
     * 預訂或退房
     * @param id    房間編号
     * @param isIn  是否預訂     預訂:true,退房:false
     */
    public void inOrOut(String id, boolean isIn){

        try {
            //将傳入的字元串類型的id轉換為int類型
            int idInt = Integer.parseInt(id);

            //擷取樓層
            int floor = idInt / 100;

            //具體的房間号
            int roomId = idInt % 100;

            rooms[--floor][--roomId].setUse(isIn);
        } catch (NumberFormatException e) {
            //當使用者輸入一個非正确數字時會捕獲這個異常
            System.out.println(id + "不是一個數字,請輸入正确的數字!");
        } catch (ArrayIndexOutOfBoundsException e) {
            //當使用者輸入的房間編号資訊有誤時,捕獲這個異常
            System.out.println("您輸入的房間号碼" + id + "有誤,請輸入正确的房間編号");
        } 

    }
           

繼續閱讀