欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

5 使用数组实现酒店房间管理系统

程序员文章站 2022-03-21 14:22:43
...

酒店房间管理系统需求

有家酒店一共有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 + "有误,请输入正确的房间编号");
        } 

    }
相关标签: Java基础教程