本篇文章是基于B站老杜酒店管理系统部分功能实现基础上做了一些修改和优化。
一、实现要求1、知识点
- 数组类;
- 循环(while、for);
- switch语句;
- if语句
2、实现功能
- 实现查看房间列表;(以下是需求的房间列表)
-
[101,标准间(单人),空闲] [102,标准间(单人),空闲] [103,标准间(单人),空闲] [104,标准间(单人),空闲] [105,标准间(单人),空闲] [106,标准间(单人),空闲] [107,标准间(单人),空闲] [201,标准间(单人),空闲] [202,标准间(单人),空闲] [203,标准间(单人),空闲] [204,标准间(单人),空闲] [205,标准间(单人),空闲] [206,标准间(单人),空闲] [207,标准间(单人),空闲] [301,标准间(双人),空闲] [302,标准间(双人),空闲] [303,标准间(双人),空闲] [304,标准间(双人),空闲] [305,标准间(双人),空闲] [306,标准间(双人),空闲] [307,标准间(双人),空闲] [401,标准间(双人),空闲] [402,标准间(双人),空闲] [403,标准间(双人),空闲] [404,标准间(双人),空闲] [405,标准间(双人),空闲] [406,标准间(双人),空闲] [407,标准间(双人),空闲] [501,标准间(双人),空闲] [502,标准间(双人),空闲] [503,标准间(双人),空闲] [504,标准间(双人),空闲] [505,标准间(双人),空闲] [506,标准间(双人),空闲] [507,标准间(双人),空闲] [601,情侣套房,空闲] [602,情侣套房,空闲] [603,情侣套房,空闲] [604,情侣套房,空闲] [605,情侣套房,空闲] [606,情侣套房,空闲] [607,情侣套房,空闲] [701,豪华套房,空闲] [702,豪华套房,空闲] [703,豪华套房,空闲] [801,总统套房,空闲]
- 实现订房、退房功能
酒店客房类
重写equals方法和toString方法是因为GuestRoom类默认继承Object类,而Object类里默认实现的
equals方法比较的是对象的内存地址,而程序需要比较的是两个对象的内容,所以要重写equals方
法,toString方法也是异曲同工。以下方法都能通过IDEA工具自动生成。
public class GuestRoom {//酒店客房类
private int roomNo;//房间编号
private String roomType;//房间类型
private boolean roomStatus;//房间状态
//构造方法
public GuestRoom() {
}
public GuestRoom(int roomNo, String roomType, boolean roomStatus) {
this.roomNo = roomNo;
this.roomType = roomType;
this.roomStatus = roomStatus;
}
//set、get方法
public int getRoomNo() {
return roomNo;
}
public void setRoomNo(int roomNo) {
this.roomNo = roomNo;
}
public String getRoomType() {
return roomType;
}
public void setRoomType(String roomType) {
this.roomType = roomType;
}
public boolean isRoomStatus() {
return roomStatus;
}
public void setRoomStatus(boolean roomStatus) {
this.roomStatus = roomStatus;
}
//重写toString方法
public String toString() {
return "[" +roomNo+ "," +roomType+ "," +(roomStatus ? "空闲" : "占用" )+ "]" ;
}
//重写equals、hashCode方法
public boolean equals(Object obj) {
if (this == obj) return true;
if (null == obj || !(obj instanceof GuestRoom)) return false;
GuestRoom room = (GuestRoom) obj;
return this.roomNo == room.roomNo;
}
public int hashCode() {
return Objects.hash(roomNo, roomType, roomStatus);
}
}
酒店类
数组中如果for循环下还嵌套了一个for循环,第一个for循环代表的是纵向,第二个for循环代表的是
横向。看过老杜那期视频的都知道当时他实现的代码每个楼层房间数是一样的,所以只套在了同一
个for循环下,而实际生活中有些酒店每个楼层的房间数是不一样的,标间可以有很多个,但豪套
房是很少的。所以这里我在第一个for循环里加了两个for循环,并修改变量的取值范围。达成了我
的需求:1~6层每层7个房间,第7层3个房间,第8层只有1个房间。
public class GrandHotel {
private GuestRoom[][] rooms ;
//楼层及房间号
//1~6层
public GrandHotel(){
rooms = new GuestRoom[8][7];//8层楼
for (int i = 0; i < rooms.length; i++){
for(int j = 0;j < rooms[i].length;j++) {
switch (i){
case 0:
case 1:
rooms[i][j] = new GuestRoom((i+1)*100 + j +1,"标准间(单人)",true);
break;
case 2:
case 3:
case 4:
rooms[i][j] = new GuestRoom((i+1)*100 + j + 1, "标准间(双人)", true);
break;
case 5:
rooms[i][j] = new GuestRoom((i+1)*100 + j + 1, "情侣套房", true);
break;
}
}
//第7层
for(int j = 0;j < 3;j++) {
switch (i) {
case 6:
rooms[i][j] = new GuestRoom((i + 1) * 100 + j + 1, "豪华套房", true);
break;
}
}
//第8层
for(int j = 0;j < 1;j++) {
switch (i) {
case 7:
rooms[i][j] = new GuestRoom((i + 1) * 100 + j + 1, "总统套房", true);
break;
}
}
}
}
接下来是打印房间,订房以及退房的方法
打印房间的方法没有什么改动,在订房退房方法中加了一些条件
//打印房间的方法
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.print(" ");
}
System.out.print("n");
}
}
//订房
public void order(int roomNo) {//订房
//调用此方法时需要传递一个由前台输入的房间编号过来
if( (roomNo / 100)<=8 && (roomNo % 100) < 7 && roomNo>=101 && roomNo <= 801 | roomNo <= 703) {
GuestRoom room = rooms[(roomNo / 100) - 1][(roomNo % 100) - 1];//获取房间对象
room.setRoomStatus(false);
System.out.println(roomNo + "已订");
}
else {
System.out.println("没有该房间");
}
}
//退房
public void exit(int roomNo){
if( (roomNo / 100)<=8 && (roomNo % 100) < 7 && roomNo>=101 && roomNo <= 801 && roomNo <= 703) {
GuestRoom room = rooms[(roomNo / 100) - 1][(roomNo % 100) - 1];
room.setRoomStatus(true);
System.out.println(roomNo +"已退");
}
else {
System.out.println("退房出错,没有该房间");
}
}
}
因为在最后测试程序中如果输入了100,208,704,802等不存在的房间号,如果不加上这个if语句就
会报出ArrayIndexOutOfBoundsException异常(非法索引访问数组),大致意思就是索引的长度
和代码规定的不符。所以可以写一个判断语句,我这里的判断语句还不够精确,只能包含大部分输
入错误的情况,所以仅供参考。退房代码和订房大致相同。
if( (roomNo / 100)<=8 && (roomNo % 100) < 7 && roomNo>=101 && roomNo <= 801 | roomNo <= 703) {
else {
System.out.println("没有该房间");
}
2.测试程序
这里我没有采用老杜当时的if语句,换成了switch语句,感觉更简便一些,这里写了一个Scanner类
的方法,输入数据。
public class Management {
public static void main(String[] args) throws Exception{
System.out.println("欢迎使用“天上人间”酒店管理系统");
GrandHotel hotel = new GrandHotel();//创建酒店对象
//hotel.print();//打印房间状态
while (true) {
System.out.println("对应功能编号:【1】:查看房间列表 || 【2】:订房 || 【3】:退房 || 【4】:退出系统");
Scanner s = new Scanner(System.in);
System.out.print("请输入功能编号:");
int x = s.nextInt();
switch (x) {
case 1:
hotel.print();
break;
case 2:
System.out.print("请输入订房房间编号:");
int roomNo1 = s.nextInt();
hotel.order(roomNo1);
break;
case 3:
System.out.print("请输入退房房间编号:");
int roomNo2 = s.nextInt();
hotel.exit(roomNo2);
break;
case 4:
System.out.println("谢谢使用");
break;
default:
System.out.println("功能编号错误,请重新输入");
}
}
}
}
三、实现结果
欢迎使用“天上人间”酒店管理系统 对应功能编号:【1】:查看房间列表 || 【2】:订房 || 【3】:退房 || 【4】:退出系统 请输入功能编号:2 请输入订房房间编号:201 201已订 对应功能编号:【1】:查看房间列表 || 【2】:订房 || 【3】:退房 || 【4】:退出系统 请输入功能编号:3 请输入退房房间编号:201 201已退 对应功能编号:【1】:查看房间列表 || 【2】:订房 || 【3】:退房 || 【4】:退出系统 请输入功能编号:2 请输入订房房间编号:208 没有该房间 对应功能编号:【1】:查看房间列表 || 【2】:订房 || 【3】:退房 || 【4】:退出系统 请输入功能编号:4 谢谢使用
以上便是测试结果,当输入房间编号:208时,不会出现索引异常,其他基础功能也能正常实现。
四、总结和心得虽然实验结果和预计一样出来了,但这只是一小部分的功能实现了,仅仅在别人的大框架上做了
些优化。
选择这个程序作为自己的第一篇文章是因为其中的代码在javase中具有一定的代表性,而
且自己在编程时也投入了很多精力和思考,是作为一个入门级java程序员在漫漫编程路上的一盏灯
塔,道阻且长却更要坚定的走下去。



