You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:30:56