/* * 模拟酒店管理系统 * 酒店类 * 酒店规模为: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 } }
效果如下