/*
* 模拟酒店管理系统
* 酒店类
* 酒店规模为:5层 每层3个房间 二维数组
* 其中1、2层为标准间 3、4层为双人间 5层为豪华间
* 需要提供对应得打印房间列表的方法
* 打印格式:【101 标准间 空闲】【102 标准间 占用】...
* 预定房间的方法
* 退定房间的方法
* */
public class Hotel {
// 酒店内所有房间
private final Room[][] rooms;
// 在构造方法中初始化房间对象,初始化后可在当前类中使用
public Hotel() {
rooms = new Room[5][3]; // 成员引用型变量初始化,可是成员方法中直接使用
// 其中1、2层为标准间 3、4层为双人间 5层为豪华间
for (int i = 0; i < rooms.length; i++) {
String number;
String type;
if (i<2){
for (int j = 0; j < rooms[i].length; j++) {
number = (i+1)*100 + (j+1) + "";
rooms[i][j] = new Room(number, "标准间", false);
}
}else if (i<4){
for (int j = 0; j < rooms[i].length; j++) {
number = (i+1)*100 + (j+1) + "";
rooms[i][j] = new Room(number, "双人间", false);
}
}else {
for (int j = 0; j < rooms[i].length; j++) {
number = (i+1)*100 + (j+1) + "";
rooms[i][j] = new Room(number, "豪华间", false);
}
}
}
}
/**
* 判断用户输入是否合法
* @param i 酒店房间层数
* @param j 酒店每层房间数
* @return Boolean
*/
public boolean IsLegal(int i,int j){
if (i<0 || i>rooms.length || j<0 ||j> rooms.length){
System.out.println("对不起,您选择的房间不存在");
return false;
}else return true;
}
/**
* 酒店房间下标转换
* @param num 用户输入的字符串类型房间号
* @return 酒店房间层数 和 酒店每层房间数 对应的标号
*/
public int[] StringToInt(String num){
int number = Integer.parseInt(num);
int[] arr = new int[2];
int i = number/100 - 1;
int j = number - (i+1)*100 - 1;
arr[0] = i;
arr[1] = j;
return arr; // 使用数组返回两个值
}
/**
* 退定方法(冗余)
* @param num string类型房间号
*/
public void subScribe(String num){
int[] arr = StringToInt(num);
int i = arr[0];
int j = arr[1];
if (IsLegal(i,j)){
if (!rooms[i][j].isFlag()){
System.out.println("对不起,您选择的房间"+rooms[i][j].getNumbers()+"没有预定");
return;
}
if (i<2){
rooms[i][j].setFlag(false);
System.out.println("标准间" + rooms[i][j].getNumbers() + "退订成功!");
// System.out.println("您退订的房间信息为:"+rooms[i][j].getNumbers()+
// " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
System.out.println("您退订的房间信息更新为:"); // 自动调用toString
System.out.println(rooms[i][j]); // toString的应用场景
System.out.println();
}else if (i<4){
rooms[i][j].setFlag(false);
System.out.println("双人间" + rooms[i][j].getNumbers() + "退订成功!");
// System.out.println("您退订的房间信息为:"+rooms[i][j].getNumbers()+
// " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
System.out.println("您退订的房间信息更新为:"); // 自动调用toString
System.out.println(rooms[i][j]);
System.out.println();
}else if (i==4){
rooms[i][j].setFlag(false);
System.out.println("豪华间" + rooms[i][j].getNumbers() + "退订成功!");
// System.out.println("您退订的房间信息为:"+rooms[i][j].getNumbers()+
// " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
System.out.println("您退订的房间信息更新为:");
System.out.println(rooms[i][j]); // 自动调用toString
System.out.println();
}
}
}
/**
* 预定方法
* @param num string类型房间号
*/
public void order(String num){
int[] array = StringToInt(num);
int i = array[0];
int j = array[1];
if (IsLegal(i,j)){
if (rooms[i][j].isFlag()){
System.out.println("对不起,您选择的房间"+rooms[i][j].getNumbers()+"已被预定");
return;
}
if (i<2){ // 每一项里面都是重复代码,是否可以改进?使用循环
rooms[i][j].setFlag(true);
System.out.println("标准间" + rooms[i][j].getNumbers() + "预订成功!");
// System.out.println("您预订的房间信息为:"+rooms[i][j].getNumbers()+
// " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
System.out.println("您预订的房间信息更新为:"); // 自动调用toString
System.out.println(rooms[i][j]);
System.out.println();
}else if (i<4){
rooms[i][j].setFlag(true);
System.out.println("双人间" + rooms[i][j].getNumbers() + "预订成功!");
// System.out.println("您预订的房间信息为:"+rooms[i][j].getNumbers()+
// " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
System.out.println("您预订的房间信息更新为:"); // 自动调用toString
System.out.println(rooms[i][j]);
System.out.println();
}else if (i==4){
rooms[i][j].setFlag(true);
System.out.println("豪华间" + rooms[i][j].getNumbers() + "预订成功!");
// System.out.println("您预订的房间信息为:"+rooms[i][j].getNumbers()+
// " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
System.out.println("您预订的房间信息更新为:"); // 自动调用toString
System.out.println(rooms[i][j]);
System.out.println();
}
}
}
/**
* 预定方法 (优化),退订方法类似
* @param num 输入房间号(字符串类型)
*/
public void orderRoom(String num){
int[] arr = StringToInt(num);
int i = arr[0];
int j = arr[1];
if (IsLegal(i,j)){
if (rooms[i][j].isFlag()){
System.out.println("对不起,您选择的房间"+rooms[i][j].getNumbers()+"已被预定");
}else {
rooms[i][j].setFlag(true);
System.out.println("房间:" + rooms[i][j].getNumbers() + "预订成功!");
// System.out.println("您预订的房间信息为:"+rooms[i][j].getNumbers()+
// " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
System.out.println("您预订的房间信息更新为:"); // 自动调用toString
System.out.println(rooms[i][j]);
System.out.println();
}
}
}
/**
* 打印方法(遍历二维数组以指定格式打印)
*/
public void look(){
for (Room[] room : rooms) {
for (Room value : room) {
// System.out.println("房间号:" + value.getNumbers() + " 房间类型:"
// + value.getType() + " 是否占用:" + (value.isFlag() ? "占用":"空闲"));
// 输出时引用类型对象Room,自动调用该对象的toString方法
// 避免多处输出时 存在重复底代码,更加简洁
System.out.println(value);
}
}
}
}
/*
* 模拟酒店管理系统
* 房间类
* 房间编号:格式 101、102 201、202 int/string
* 房间类型:12标准 34双人 5豪华 string
* 是否占用:true表示占用,false空闲,默认所有房间均空闲 boolean
*
* Bean
* 1 成员变量私有化
* 2 无参构造
* 3 全参构造
* 4 根据需求提供构造方法重载
* 5 每个变量对用getter/setter
* */
public class Room {
// 房间编号
private String numbers;
// 房间类型
private String type;
// 是否占用
private boolean flag;
public Room(String numbers, String type, boolean flag) {
this.numbers = numbers;
this.type = type;
this.flag = flag;
}
public String getNumbers() {
return numbers;
}
public void setNumbers(String numbers) {
this.numbers = numbers;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
/*
此处相当于实现 三目运算符
// (value.isFlag() ? "占用" : "空闲") 用三目运算符输出是否占用
public String isFlag() {
String flagPrint;
if (flag) {
flagPrint = "占用";
return flagPrint;
}else{
flagPrint = "空闲";
return flagPrint;
}
}
*/
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
// toString描述房间信息,不同实例化后的对象有共同的三个属性
@Override
public String toString() {
// (value.isFlag() ? "占用" : "空闲") 用三目运算符输出是否占用
return "房间号:" + numbers + " 房间类型:"
+ type + " 是否占用:" + (flag ? "占用":"空闲");
}
}
/*
* 模拟酒店管理系统
* 客户端类
* 开始打印所有房间
* 等待控制台输入,输入格式:预定101 或 退订101
* 根据输入内容,做相应操作,预定或退订完成之后,再次打印所有房间列表
*
* */
public class Client {
public static void main(String[] args) {
// 开始打印所有房间
Hotel hotel = new Hotel();
// 调用打印方法。展示房间列表
System.err.println("当前房间信息为:");
hotel.look();
// 死循环 start
order(hotel);
}
public static void order(Hotel hotel){
// 接收控制台输入
Scanner scanner = new Scanner(System.in);
// 接收控制台输入
System.err.println("请输入办理业务:预订/退定");
String business = scanner.nextLine();
System.err.println("请输入房间号:格式:x01-x10 x=1~5");
String number = scanner.nextLine();
// 一行中同时输入 op 和 num
// String op = scanner.next();
// int num = scanner.nextInt(); // 也可以输入字符
// 预定退订操作
if (business.equals("预定")){
System.out.println("您办理的业务为预定房间!");
hotel.order(number);
}else if (business.equals("退订")){
System.out.println("您办理的业务为退定房间!");
hotel.subScribe(number);
}else {
System.out.println("输入业务类型错误!办理业务失败!");
}
// 判断是否继续办理业务
System.err.println("是否继续办理业务?");
System.err.println("输入2打印房间信息,输入1继续,输入0退出");
String user = scanner.nextLine();
if (user.equals("2")){
// 打印所有房间号
System.out.println("酒店房间信息更新为:");
hotel.look();
System.err.println("是否继续办理业务?");
System.err.println("输入1继续,输入0退出");
String type = scanner.nextLine();
if (type.equals("1")){
order(hotel);
} else {
scanner.close();
System.exit(0);
}
} else if (user.equals("1")){
order(hotel);
} else {
scanner.close();
System.exit(0);
}
// 死循环 end
}
}
效果如下