Java剧场预订系统疑问:BookingManager实现与文件读取
解决方案
1. 实现BookingManager类的基础结构
首先定义BookingManager类,包含两个私有数组分别存储单个预订(Booking)和团体成员预订(GroupBooking),以及对应计数器记录已存储数量。假设GroupBooking继承自Booking(合理设计,因为团体预订本质是特殊的预订类型)。
public class BookingManager { // 存储单个预订的数组,最大容量180 private Booking[] individualBookings; // 存储团体成员预订的数组,最大容量180 private GroupBooking[] groupMemberBookings; // 单个预订的已存储数量计数器 private int individualCount; // 团体成员预订的已存储数量计数器 private int groupMemberCount; // 构造器,初始化数组并加载预订数据 public BookingManager() { // 初始化数组容量 individualBookings = new Booking[180]; groupMemberBookings = new GroupBooking[180]; // 初始化计数器为0 individualCount = 0; groupMemberCount = 0; // 调用文件读取方法 loadBookingsFromFile(); } // 读取bookings.txt文件的私有方法 private void loadBookingsFromFile() { // 后续实现文件解析逻辑 } }
2. 实现构造器中的文件读取与对象实例化
先明确bookings.txt的通用格式(可根据实际需求调整):
- 单个预订行:
IND,姓名,座位号,例如IND,John Doe,A12 - 团体预订行:
GRP,成员数量,姓名1,座位号1,姓名2,座位号2,...,例如GRP,3,Jane Smith,B01,Tom Lee,B02,Alice Wang,B03
接下来实现loadBookingsFromFile方法,逐行解析文件内容并实例化对应对象:
private void loadBookingsFromFile() { String filePath = "bookings.txt"; try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; while ((line = reader.readLine()) != null) { line = line.trim(); if (line.isEmpty()) continue; String[] parts = line.split(","); // 判断预订类型 if (parts[0].equals("IND")) { // 解析单个预订 if (parts.length >= 3) { String name = parts[1].trim(); String seat = parts[2].trim(); Booking booking = new Booking(name, seat); // 检查数组容量,避免越界 if (individualCount < 180) { individualBookings[individualCount] = booking; individualCount++; } else { System.out.println("单个预订容量已满,无法添加新预订"); } } } else if (parts[0].equals("GRP")) { // 解析团体预订 if (parts.length >= 2) { try { int memberNum = Integer.parseInt(parts[1].trim()); // 校验参数数量是否匹配(1个类型标记+1个数量+2*成员数的姓名/座位) if (parts.length == 2 + 2 * memberNum) { for (int i = 0; i < memberNum; i++) { int nameIdx = 2 + 2 * i; int seatIdx = nameIdx + 1; String memberName = parts[nameIdx].trim(); String memberSeat = parts[seatIdx].trim(); GroupBooking groupBooking = new GroupBooking(memberName, memberSeat); // 检查团体预订数组容量 if (groupMemberCount < 180) { groupMemberBookings[groupMemberCount] = groupBooking; groupMemberCount++; } else { System.out.println("团体预订容量已满,停止添加剩余成员"); break; } } } else { System.out.println("团体预订格式错误:" + line); } } catch (NumberFormatException e) { System.out.println("成员数量格式错误:" + line); } } } else { System.out.println("未知预订类型:" + line); } } } catch (IOException e) { System.out.println("读取预订文件失败:" + e.getMessage()); } }
关键细节说明
- 数组越界防护:每次添加对象前检查计数器是否小于180,避免数组溢出。
- 资源自动管理:使用
try-with-resources语法自动关闭文件流,防止资源泄漏。 - 格式校验:拆分后验证参数长度,解析数字时捕获格式异常,避免程序崩溃。
- 继承优化:如果
GroupBooking未继承Booking,可调整数组类型,但建议采用继承设计,便于后续扩展预订类型。
内容的提问来源于stack exchange,提问作者CodingFrantically
相关产品推荐
相关产品推荐

