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 + "有误,请输入正确的房间编号");
}
}
上一篇: php进程间通信--有名管道
下一篇: 采集新闻API