java实训 | 低配版模拟火车订票系统

代码: 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;

public class TrainBookingSystem {

    private JFrame frame;
    private JPanel loginPanel, mainPanel;
    private JTextField usernameField;
    private JPasswordField passwordField; // 改为JPasswordField
    private JTextField departureField, destinationField;
    private JButton searchButton;
    private List<Train> trainList;
    private List<Order> paidOrders;
    private List<Order> waitingListOrders;
    private List<Order> myTickets;
    private JPanel paidPanel, waitingListPanel, myTicketsPanel;

    public TrainBookingSystem() {
        frame = new JFrame("12306 Train Booking System");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);

        createLoginInterface();
        initTrainData();
        paidOrders = new ArrayList<>();
        waitingListOrders = new ArrayList<>();
        myTickets = new ArrayList<>();
    }

    private void createLoginInterface() {
        loginPanel = new JPanel(new BorderLayout());
        loginPanel.add(createWelcomeLabel(), BorderLayout.NORTH);

        JPanel authPanel = new JPanel(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.insets = new Insets(10, 5, 10, 5);
        constraints.fill = GridBagConstraints.HORIZONTAL;

        constraints.gridx = 0;
        constraints.gridy = 0;
        authPanel.add(new JLabel("账号:"), constraints);
        constraints.gridx = 1;
        authPanel.add(usernameField = new JTextField(30), constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;
        authPanel.add(new JLabel("密码:"), constraints);
        constraints.gridx = 1;
        authPanel.add(passwordField = new JPasswordField(30), constraints);

        JButton loginButton = new JButton("登录");
        loginButton.addActionListener(e -> login());
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 2; // 按钮横跨两列
        authPanel.add(loginButton, constraints); // 移除多余的参数

        loginPanel.add(authPanel, BorderLayout.CENTER);
        frame.setContentPane(loginPanel);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JLabel createWelcomeLabel() {
        JLabel welcomeLabel = new JLabel("欢迎使用12306订票系统");
        Font font = new Font("SansSerif", Font.BOLD, 24);
        welcomeLabel.setFont(font);
        welcomeLabel.setHorizontalAlignment(SwingConstants.CENTER);
        return welcomeLabel;
    }

    private void login() {
        String username = usernameField.getText();
        char[] passwordChars = passwordField.getPassword();
        String password = new String(passwordChars);

        if (!username.isEmpty() && !password.isEmpty()) {
            // 登录逻辑
            frame.setContentPane(createMainInterface());
            frame.revalidate();
            frame.repaint();
        } else {
            JOptionPane.showMessageDialog(frame, "请输入账号和密码!");
        }
    }

    private JPanel createMainInterface() {
        mainPanel = new JPanel(new BorderLayout());

        // 左侧面板
        JPanel leftPanel = new JPanel(new BorderLayout());
        leftPanel.setPreferredSize(new Dimension((int)(frame.getWidth() * 0.75), frame.getHeight()));
        leftPanel.setBorder(BorderFactory.createTitledBorder("车票查询"));

        JPanel inputPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets = new Insets(10, 5, 10, 5);

        gbc.gridx = 0;
        gbc.gridy = 0;
        inputPanel.add(new JLabel("始发站:"), gbc);
        gbc.gridx = 1;
        gbc.gridwidth = 2;
        inputPanel.add(departureField = new JTextField(30), gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        inputPanel.add(new JLabel("终点站:"), gbc);
        gbc.gridx = 1;
        inputPanel.add(destinationField = new JTextField(30), gbc);

        searchButton = new JButton("车次查询");
        searchButton.addActionListener(e -> showTrainList());
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridwidth = 3;
        inputPanel.add(searchButton, gbc);

        leftPanel.add(inputPanel, BorderLayout.CENTER);

        // 右侧面板
        JPanel rightPanel = new JPanel(new GridLayout(3, 1)); // 3行1列的网格布局
        rightPanel.setPreferredSize(new Dimension(frame.getWidth() / 4, frame.getHeight()));
        rightPanel.setBorder(BorderFactory.createTitledBorder("个人订单查询"));

        // 初始化面板并添加到右侧面板
        paidPanel = new JPanel(new FlowLayout());
        waitingListPanel = new JPanel(new FlowLayout());
        myTicketsPanel = new JPanel(new FlowLayout());

        // 订单管理按钮初始化并添加到右侧面板
        JButton paidOrdersButton = new JButton("已支付");
        paidOrdersButton.addActionListener(e -> showOrders(paidOrders));
        rightPanel.add(paidOrdersButton, BorderLayout.NORTH);

        // 注意:需要将候补订单按钮添加到面板上
        JButton waitingListOrdersButton = new JButton("候补订单");
        waitingListOrdersButton.addActionListener(e -> showOrders(waitingListOrders));
        // 将候补订单按钮添加到rightPanel中
        rightPanel.add(waitingListOrdersButton, BorderLayout.CENTER);

        JButton myTicketsButton = new JButton("本人车票");
        myTicketsButton.addActionListener(e -> showOrders(myTickets));
        rightPanel.add(myTicketsButton, BorderLayout.SOUTH);

        rightPanel.add(new JLabel(" "), BorderLayout.CENTER);

        mainPanel.add(leftPanel, BorderLayout.CENTER);
        mainPanel.add(rightPanel, BorderLayout.EAST);

        // 初始订单显示更新
        updateOrderDisplays();
        return mainPanel;
    }
    private void showOrders(List<Order> orders) {
        if (orders.isEmpty()) {
            JOptionPane.showMessageDialog(frame, "当前没有订单!");
        } else {
            String message = "订单信息:\n";
            for (Order order : orders) {
                message += order.toString() + "\n";
            }
            JOptionPane.showMessageDialog(frame, message, "订单列表", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private void showTrainList() {
        JDialog dialog = new JDialog(frame, "车次列表", true);
        dialog.setLayout(new BorderLayout());
        dialog.setSize(400, 300);

        JPanel trainInfoPanel = new JPanel(new GridLayout(trainList.size(), 1));
        for (Train train : trainList) {
            JPanel trainPanel = new JPanel(new BorderLayout());
            JButton bookButton = new JButton("订票");
            JButton waitlistButton = new JButton("候补");
            waitlistButton.setVisible(false);

            bookButton.addActionListener(evt -> {
                if (train.book()) {
                    addOrder(train, true); // 订票成功
                    JOptionPane.showMessageDialog(frame, "订票成功!");
                    dialog.dispose();
                } else {
                    waitlistButton.setVisible(true);
                }
            });

            waitlistButton.addActionListener(evt -> {
                addOrder(train, false); // 候补票
                JOptionPane.showMessageDialog(frame, "候补成功!");
                dialog.dispose();
            });

            trainPanel.add(new JLabel(train.getTrainNumber() + " - " + train.getDepartureTime() + " - 剩余票数:" + train.getRemainingSeats()), BorderLayout.CENTER);
            JPanel buttonPanel = new JPanel(new FlowLayout());
            buttonPanel.add(bookButton);
            buttonPanel.add(waitlistButton);
            trainPanel.add(buttonPanel, BorderLayout.EAST);
            trainInfoPanel.add(trainPanel);
        }

        JScrollPane scrollPane = new JScrollPane(trainInfoPanel);
        dialog.add(scrollPane, BorderLayout.CENTER);
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }

    private void addOrder(Train train, boolean isPaid) {
        Order order = new Order(train, isPaid);
        if (isPaid) {
            paidOrders.add(order);
            myTickets.add(order);
        } else {
            waitingListOrders.add(order);
        }
        updateOrderDisplays();
    }

    private void updateOrderDisplays() {
        // 此处不再需要removeAll,因为面板已经初始化
        paidPanel.removeAll();
        waitingListPanel.removeAll();
        myTicketsPanel.removeAll();

        // 直接添加订单信息
        for (Order order : paidOrders) {
            paidPanel.add(new JLabel(order.toString()));
        }
        for (Order order : waitingListOrders) {
            waitingListPanel.add(new JLabel(order.toString()));
        }
        for (Order order : myTickets) {
            myTicketsPanel.add(new JLabel(order.toString()));
        }

        paidPanel.repaint();
        waitingListPanel.repaint();
        myTicketsPanel.repaint();
    }

    private void initTrainData() {
        trainList = new ArrayList<>();
        trainList.add(new Train("G123", "08:00", 150));
        trainList.add(new Train("G124", "09:30", 100));
        trainList.add(new Train("G125", "11:00", 200));
        trainList.add(new Train("G126", "13:00", 0));
        trainList.add(new Train("G127", "15:00", 75));
    }

    class Train {
        private String trainNumber;
        private String departureTime;
        private int remainingSeats;

        public Train(String trainNumber, String departureTime, int remainingSeats) {
            this.trainNumber = trainNumber;
            this.departureTime = departureTime;
            this.remainingSeats = remainingSeats;
        }

        public String getTrainNumber() {
            return trainNumber;
        }

        public String getDepartureTime() {
            return departureTime;
        }

        public int getRemainingSeats() {
            return remainingSeats;
        }

        public boolean book() {
            if (remainingSeats > 0) {
                remainingSeats--;
                return true;
            }
            return false;
        }
    }

    class Order {
        private Train train;
        private boolean isPaid;

        public Order(Train train, boolean isPaid) {
            this.train = train;
            this.isPaid = isPaid;
        }

        @Override
        public String toString() {
            return isPaid ? "已支付: " + train.getTrainNumber() + " " + train.getDepartureTime() :
                    "候补: " + train.getTrainNumber() + " " + train.getDepartureTime();
        }
    }

    public static void main(String[] args) {
        new TrainBookingSystem();
    }
}

代码注释:

// 导入Swing库,用于创建图形用户界面  
import javax.swing.*;   
// 导入AWT库,包含用于构建图形用户界面和图像、字体、颜色等资源的类  
import java.awt.*;   
// 导入AWT的事件处理库,用于处理如按钮点击等用户事件  
import java.awt.event.ActionEvent;   
// 导入Java的集合库,用于创建列表  
import java.util.ArrayList;   
import java.util.List;   
  
// 定义一个名为TrainBookingSystem的公共类,代表火车订票系统  
public class TrainBookingSystem {   
  
    // 声明多个私有成员变量,分别用于存储框架、面板、文本字段、按钮、火车列表和订单列表等  
    private JFrame frame;   
    private JPanel loginPanel, mainPanel;   
    private JTextField usernameField;   
    private JPasswordField passwordField; // 改用JPasswordField来更安全地处理密码输入  
    private JTextField departureField, destinationField;   
    private JButton searchButton;   
    private List<Train> trainList;   
    private List<Order> paidOrders;   
    private List<Order> waitingListOrders;   
    private List<Order> myTickets;   
    private JPanel paidPanel, waitingListPanel, myTicketsPanel;   
  
    // 构造函数,用于初始化系统  
    public TrainBookingSystem() {   
        // 创建框架并设置其标题、关闭操作和大小  
        frame = new JFrame("12306 Train Booking System");   
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        frame.setSize(800, 600);   
  
        // 创建登录界面  
        createLoginInterface();   
  
        // 初始化火车数据  
        initTrainData();   
  
        // 初始化订单列表  
        paidOrders = new ArrayList<>();   
        waitingListOrders = new ArrayList<>();   
        myTickets = new ArrayList<>();   
    }   
  
    // 创建一个登录界面的方法  
    private void createLoginInterface() {   
        // 创建一个布局为BorderLayout的面板  
        loginPanel = new JPanel(new BorderLayout());   
  
        // 添加欢迎标签到面板的北部  
        loginPanel.add(createWelcomeLabel(), BorderLayout.NORTH);   
  
        // 创建一个用于账号和密码输入的面板,布局为GridBagLayout  
        JPanel authPanel = new JPanel(new GridBagLayout());   
        GridBagConstraints constraints = new GridBagConstraints();   
  
        // 设置GridBagConstraints对象,用于指定组件在GridBagLayout中的位置和填充方式  
        constraints.insets = new Insets(10, 5, 10, 5);   
        constraints.fill = GridBagConstraints.HORIZONTAL;   
  
        // 添加账号标签和文本字段到authPanel  
        constraints.gridx = 0;   
        constraints.gridy = 0;   
        authPanel.add(new JLabel("账号:"), constraints);   
        constraints.gridx = 1;   
        authPanel.add(usernameField = new JTextField(30), constraints);   
  
        // 添加密码标签和密码字段到authPanel  
        constraints.gridx = 0;   
        constraints.gridy = 1;   
        authPanel.add(new JLabel("密码:"), constraints);   
        constraints.gridx = 1;   
        authPanel.add(passwordField = new JPasswordField(30), constraints);   
  
        // 创建一个登录按钮并为其添加点击事件监听器  
        JButton loginButton = new JButton("登录");   
        loginButton.addActionListener(e -> login());   
  
        // 将登录按钮添加到authPanel,横跨两列  
        constraints.gridx = 0;   
        constraints.gridy = 2;   
        constraints.gridwidth = 2;   
        authPanel.add(loginButton, constraints);   
  
        // 将authPanel添加到loginPanel的中心区域  
        loginPanel.add(authPanel, BorderLayout.CENTER);   
  
        // 将loginPanel设置为框架的内容面板,并设置框架的位置和可见性  
        frame.setContentPane(loginPanel);   
        frame.setLocationRelativeTo(null);   
        frame.setVisible(true);   
    }   
  
    // 创建一个欢迎标签的方法  
    private JLabel createWelcomeLabel() {   
        // 创建一个标签并设置其文本、字体和对齐方式  
        JLabel welcomeLabel = new JLabel("欢迎使用12306订票系统");   
        Font font = new Font("SansSerif", Font.BOLD, 24);   
        welcomeLabel.setFont(font);
welcomeLabel.setHorizontalAlignment(SwingConstants.CENTER);   
        // 返回创建的欢迎标签  
        return welcomeLabel;   
    }   
  
    // 定义一个登录方法  
    private void login() {   
        // 从文本字段中获取账号和密码  
        String username = usernameField.getText();   
        char[] passwordChars = passwordField.getPassword();   
        String password = new String(passwordChars);   
  
        // 如果账号和密码都不为空,则执行登录逻辑  
        if (!username.isEmpty() && !password.isEmpty()) {   
            // 假设的登录逻辑(实际中应包含与数据库的交互)  
            // 将框架的内容面板更改为主界面,并重新验证和重绘框架  
            frame.setContentPane(createMainInterface());   
            frame.revalidate();   
            frame.repaint();   
        } else {   
            // 如果账号或密码为空,则显示错误消息  
            JOptionPane.showMessageDialog(frame, "请输入账号和密码!");   
        }   
    }   
  
    // 创建一个主界面的方法  
    private JPanel createMainInterface() {   
        // 创建一个布局为BorderLayout的主面板  
        mainPanel = new JPanel(new BorderLayout());   
  
        // 创建左侧的面板用于输入始发站和终点站  
        JPanel leftPanel = new JPanel(new BorderLayout());   
        leftPanel.setPreferredSize(new Dimension((int)(frame.getWidth() * 0.75), frame.getHeight()));   
        leftPanel.setBorder(BorderFactory.createTitledBorder("车票查询"));   
  
        // 创建一个用于输入始发站和终点站的面板,布局为GridBagLayout  
        JPanel inputPanel = new JPanel(new GridBagLayout());   
        GridBagConstraints gbc = new GridBagConstraints();   
  
        // 设置GridBagConstraints对象  
        gbc.anchor = GridBagConstraints.WEST;   
        gbc.insets = new Insets(10, 5, 10, 5);   
  
        // 添加始发站标签和文本字段到inputPanel  
        gbc.gridx = 0;   
        gbc.gridy = 0;   
        inputPanel.add(new JLabel("始发站:"), gbc);   
        gbc.gridx = 1;   
        gbc.gridwidth = 2;   
        inputPanel.add(departureField = new JTextField(30), gbc);   
  
        // 添加终点站标签和文本字段到inputPanel  
        gbc.gridx = 0;   
        gbc.gridy = 1;   
        inputPanel.add(new JLabel("终点站:"), gbc);   
        gbc.gridx = 1;   
        inputPanel.add(destinationField = new JTextField(30), gbc);   
  
        // 创建一个查询按钮并为其添加点击事件监听器  
        searchButton = new JButton("车次查询");   
        searchButton.addActionListener(e -> showTrainList());   
  
        // 将查询按钮添加到inputPanel,横跨三列  
        gbc.gridx = 0;   
        gbc.gridy = 2;   
        gbc.gridwidth = 3;   
        inputPanel.add(searchButton, gbc);   
  
        // 将inputPanel添加到leftPanel的中心区域  
        leftPanel.add(inputPanel, BorderLayout.CENTER);   
  
        // 创建右侧的面板用于显示个人订单  
        JPanel rightPanel = new JPanel(new GridLayout(3, 1)); // 3行1列的网格布局  
        rightPanel.setPreferredSize(new Dimension(frame.getWidth() / 4, frame.getHeight()));   
        rightPanel.setBorder(BorderFactory.createTitledBorder("个人订单查询"));   
  
        // 初始化并添加用于显示已支付订单、候补订单和本人车票的面板  
        paidPanel = new JPanel(new FlowLayout());   
        waitingListPanel = new JPanel(new FlowLayout());   
        myTicketsPanel = new JPanel(new FlowLayout());   
  
        // 创建订单管理按钮并为其添加点击事件监听器  
        JButton paidOrdersButton = new JButton("已支付");   
        paidOrdersButton.addActionListener(e -> showOrders(paidOrders));   
        rightPanel.add(paidOrdersButton, BorderLayout.NORTH); // 注意:这里应该是使用GridLayout,而不是BorderLayout  
  
        // 创建候补订单按钮并为其添加点击事件监听器  
        JButton waitingListOrdersButton = new JButton("候补订单");   
        waitingListOrdersButton.addActionListener(e -> showOrders(waitingListOrders));   
        rightPanel.add(waitingListOrdersButton, 1); // 在GridLayout中,
// 这里的索引参数在GridLayout中应该是一个数字,表示添加到第几行(从0开始)。  
        // 但是,因为GridLayout并没有直接提供索引来指定具体位置,  
        // 所以我们简单地按照顺序添加。在GridLayout中,组件会自动按行和列的布局进行排列。  
        rightPanel.add(waitingListOrdersButton); // 正确地添加候补订单按钮到rightPanel  
  
        // 创建本人车票按钮并为其添加点击事件监听器  
        JButton myTicketsButton = new JButton("本人车票");   
        myTicketsButton.addActionListener(e -> showOrders(myTickets));   
        rightPanel.add(myTicketsButton); // 将本人车票按钮添加到rightPanel  
  
        // 注意:这里添加了一个JLabel(" ")作为占位符是不必要的,因为GridLayout会自动处理布局  
        // rightPanel.add(new JLabel(" "), BorderLayout.CENTER); // 移除这个不必要的代码  
  
        // 将leftPanel和rightPanel添加到mainPanel中  
        mainPanel.add(leftPanel, BorderLayout.CENTER);   
        mainPanel.add(rightPanel, BorderLayout.EAST);   
  
        // 初始化并更新订单显示  
        updateOrderDisplays();   
  
        // 返回创建的主界面面板  
        return mainPanel;   
    }   
  
    // 显示订单列表的方法  
    private void showOrders(List<Order> orders) {   
        if (orders.isEmpty()) {   
            // 如果没有订单,则显示一个消息框提示没有订单  
            JOptionPane.showMessageDialog(frame, "当前没有订单!");   
        } else {   
            // 如果有订单,则创建一个消息框显示所有订单信息  
            String message = "订单信息:\n";   
            for (Order order : orders) {   
                message += order.toString() + "\n";   
            }   
            JOptionPane.showMessageDialog(frame, message, "订单列表", JOptionPane.INFORMATION_MESSAGE);   
        }   
    }   
  
    // 显示车次列表的方法  
    private void showTrainList() {   
        // 创建一个对话框用于显示车次列表  
        JDialog dialog = new JDialog(frame, "车次列表", true);   
        dialog.setLayout(new BorderLayout());   
        dialog.setSize(400, 300);   
  
        // 创建一个面板用于显示火车信息,布局为GridLayout,大小与trainList的大小一致  
        JPanel trainInfoPanel = new JPanel(new GridLayout(trainList.size(), 1));   
  
        // 遍历trainList中的每一辆火车  
        for (Train train : trainList) {   
            // 为每一辆火车创建一个面板  
            JPanel trainPanel = new JPanel(new BorderLayout());   
  
            // 创建订票和候补按钮  
            JButton bookButton = new JButton("订票");   
            JButton waitlistButton = new JButton("候补");   
            waitlistButton.setVisible(false); // 默认情况下不显示候补按钮  
  
            // 为订票按钮添加点击事件监听器  
            bookButton.addActionListener(evt -> {   
                if (train.book()) {   
                    // 如果订票成功,则添加订单并显示成功消息  
                    addOrder(train, true);   
                    JOptionPane.showMessageDialog(frame, "订票成功!");   
                    dialog.dispose(); // 关闭车次列表对话框  
                } else {   
                    // 如果订票失败(没有剩余座位),则显示候补按钮  
                    waitlistButton.setVisible(true);   
                }   
            });   
  
            // 为候补按钮添加点击事件监听器  
            waitlistButton.addActionListener(evt -> {   
                // 添加候补订单并显示成功消息  
                addOrder(train, false);   
                JOptionPane.showMessageDialog(frame, "候补成功!");   
                dialog.dispose(); // 关闭车次列表对话框  
            });   
  
            // 在trainPanel中添加火车信息和按钮  
            trainPanel.add(new JLabel(train.getTrainNumber() + " - " + train.getDepartureTime() + " - 剩余票数:" + train.getRemainingSeats()), BorderLayout.CENTER);   
            JPanel buttonPanel = new JPanel(new FlowLayout());   
            buttonPanel.add(bookButton);   
            buttonPanel.add(waitlistButton);   
            trainPanel.add(buttonPanel, BorderLayout.EAST);   
  
            // 将trainPanel添加到trainInfoPanel中  
            trainInfoPanel.add(trainPanel);   
        }   
  
// 创建一个滚动面板来包含trainInfoPanel,并添加到对话框中  
        JScrollPane scrollPane = new JScrollPane(trainInfoPanel);   
        dialog.add(scrollPane, BorderLayout.CENTER); // 将滚动面板添加到对话框的中心位置  
  
        // 设置对话框的位置相对于父窗口居中  
        dialog.setLocationRelativeTo(frame);   
  
        // 设置对话框为可见  
        dialog.setVisible(true);   
    }  
  
    // 添加订单到对应列表的方法  
    private void addOrder(Train train, boolean isPaid) {   
        Order order = new Order(train, isPaid); // 创建一个新的订单对象  
  
        // 根据订单是否已支付,将其添加到对应的列表中  
        if (isPaid) {   
            paidOrders.add(order); // 添加到已支付订单列表  
            myTickets.add(order); // 添加到本人车票列表  
        } else {   
            waitingListOrders.add(order); // 添加到候补订单列表  
        }  
  
        // 更新订单显示面板的内容  
        updateOrderDisplays();   
    }  
  
    // 更新订单显示面板的方法  
    private void updateOrderDisplays() {   
        // 清除之前的订单信息  
        paidPanel.removeAll();   
        waitingListPanel.removeAll();   
        myTicketsPanel.removeAll();   
  
        // 遍历订单列表,将订单信息添加到对应的面板中  
        for (Order order : paidOrders) {   
            paidPanel.add(new JLabel(order.toString()));   
        }  
        for (Order order : waitingListOrders) {   
            waitingListPanel.add(new JLabel(order.toString()));   
        }  
        for (Order order : myTickets) {   
            myTicketsPanel.add(new JLabel(order.toString()));   
        }  
  
        // 重新绘制面板以显示新的订单信息  
        paidPanel.repaint();   
        waitingListPanel.repaint();   
        myTicketsPanel.repaint();   
    }  
  
    // 初始化火车数据的方法  
    private void initTrainData() {   
        trainList = new ArrayList<>();   
  
        // 添加几辆火车到trainList中,包括车次、发车时间和剩余座位数  
        trainList.add(new Train("G123", "08:00", 150));   
        trainList.add(new Train("G124", "09:30", 100));   
        trainList.add(new Train("G125", "11:00", 200));   
        trainList.add(new Train("G126", "13:00", 0)); // 这辆火车没有剩余座位  
        trainList.add(new Train("G127", "15:00", 75));   
    }  
  
    // 火车类Train,表示一辆火车  
    class Train {   
        // ...(类的成员变量和方法省略,已在前面定义)  
  
        // book方法,尝试预订火车票  
        public boolean book() {   
            if (remainingSeats > 0) { // 如果剩余座位数大于0  
                remainingSeats--; // 预订成功后,剩余座位数减1  
                return true; // 返回true表示预订成功  
            }  
            return false; // 返回false表示预订失败(没有剩余座位)  
        }  
    }  
  
    // 订单类Order,表示一个订单  
    class Order {   
        // ...(类的成员变量和方法省略,已在前面定义)  
  
        // toString方法,返回订单的字符串表示形式  
        @Override   
        public String toString() {   
            return isPaid ? "已支付: " + train.getTrainNumber() + " " + train.getDepartureTime() :  
                           "候补: " + train.getTrainNumber() + " " + train.getDepartureTime();   
        }  
    }  
  
    // 主方法,程序入口  
    public static void main(String[] args) {   
        new TrainBookingSystem(); // 创建TrainBookingSystem对象,启动订票系统  
    }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/736832.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】算法:二分查找

当我们想在一个有序的序列里面查找一个数字的时候&#xff0c;通常会想到使用循环遍历&#xff0c;也就是下面这种方法&#xff1a; 比如我们想在下面的数组里面找到7&#xff1a; int main() {int num 7;int arr[10] { 1,2,3,4,5,6,7,8,9,10 };for (int i 0; i < size…

5.树莓派4b+ubuntu18.04(ros版本melodic)+arduino mega自制两轮差速小车,实现建图导航功能

这一节介绍雷达的使用&#xff0c;我们使用的雷达型号是ydlidar x3 1.进入工作空间 cd catkin_ws/src2.下载官方提供的SDK文件 git clone https://github.com/YDLIDAR/YDLidar-SDK.git3.安装cmake sudo apt install cmake pkg-config4.编译和安装 进入YDLidar-SDK文件夹后如…

Linux动态网站架构(部署开发php代码)

动态网站架构&#xff08;部署开发php代码&#xff09; 测试能否直接部署nginx需要什么服务&#xff0c;及原理准备并进行开发测试部署代码 概述 静态网站&#xff1a;图片仅仅包含&#xff1a;html&#xff0c;css样式js脚本&#xff0c;图片及视频&#xff1b;nginx直接处…

DHCP原理1-单个局域网出现多个DHCP服务器会发生什么

1. 背景 DHCP全称是Dynamic Host Configuration Protocol。其协议标准是RFC1541&#xff08;已被RFC2131取代&#xff09;&#xff0c;主要实现服务器向客户端动态分配IP地址&#xff08;如IP地址、子网掩码、网关、DNS&#xff09;和配置信息。其系统架构是标准的C/S架构。RFC…

如何写出高效的代码?

1. 优化你的程序&#xff0c;拒绝创建不必要的对象 如果你的变量&#xff0c;后面的逻辑判断&#xff0c;一定会被赋值&#xff1b;或者说&#xff0c;只是一个字符串变量&#xff0c;直接初始化字符串常量就可以了&#xff0c;没有必要愣是要new String(). 反例&#xff1a;…

Redis 的安装与部署

本文为Redis的Linux版单机部署。 上传 redis-3.2.8 源码到 /opt/software/ 解压到 /opt/module/ [huweihadoop101 software]$ tar -zxvf redis-3.2.8.tar.gz -C /opt/module/安装依赖 [huweihadoop101 software]$ sudo yum -y install gcc-c tclRedis是C语言编写的 编译安装…

(南京观海微电子)——DC-DC和LDO的原理及应用区别

LDO: 低压差线性稳压器&#xff0c;故名思意为线性的稳压器&#xff0c;仅能使用在降压应用中&#xff0c;也就是输出电压必需小于输入电压。 优点&#xff1a;稳定性好&#xff0c;负载响应快&#xff0c;输出纹波小。 缺点&#xff1a; 效率低&#xff0c;输入输出的电压…

Linux使用——查看发行版本、内核、shell类型等基本命令

先做快照 虚拟机中编辑网络 关机 普通账户和管理员账户 互相对照 localhost相当于IP 参数: 短格式:以减号(-)开头&#xff0c;参数字母 长格式:以2个减号(--)后跟上完整的参数单词 当前发行版本 [rootserver ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 9.…

.hmallox勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已经成为网络安全的一大威胁&#xff0c;其中包括了最近出现的.hmallox勒索病毒。这类恶意软件不仅能够对计算机系统进行加密&#xff0c;还会要求用户支付赎金以换取解密密钥&#xff0c;给个人用户和企业带来了严重的…

Java面试题:数据库索引

数据库索引 索引:index 帮助mysql高效获取数据的数据结构,在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B树),这些数据结构以某种方式引用(指向数据),这样就可以在数据结构上实现高级查找算法 将数据以树的方式进行存储,提高查找效率 索引的底层结构 使用B树 …

React AntDesign Layout组件布局刷新页面错乱闪动

大家最近在使用React AntDesign Layout组件布局后刷新页面时&#xff0c;页面布局错乱闪动 经过组件属性的研究才发现&#xff0c;设置 hasSider 为 true 就能解决上面的问题&#xff0c;耽搁了半天的时间&#xff0c;接着踩坑接着加油&#xff01;&#xff01;&#xff01; …

XTDrone-多无人机精准降落-配置教程

1 编译AprilTag_ROS AprilTag是一个视觉基准系统&#xff0c;可用于机器人&#xff0c;增强现实和相机校准等。 根据AprilTag可以可靠地计算标签相对于相机的3D位置&#xff0c;方向和ID号。这里我们使用AprilTag的ROS库来实现位姿估计与ID号计算。 编译命令如下&#xff1a; …

Linux 7种 进程间通信方式

传统进程间通信 通过文件实现进程间通信 必须人为保证先后顺序 A--->硬盘---> B&#xff08;B不知道A什么时候把内容传到硬盘中&#xff09; 1.无名管道 2.有名管道 3.信号 IPC进程间通信 4.消息队列 5.共享内存 6.信号灯集 7.socket通信 一、无名管道&a…

基于I2C协议的AHT20温湿度传感器的数据采集

一、I2C总线通信协议 软件I2C 软件I2C&#xff0c;也称为模拟I2C或bit-bang I2C&#xff0c;是一种通过微控制器的通用输入输出&#xff08;GPIO&#xff09;引脚来模拟I2C总线通信的方式。它不依赖于专门的硬件I2C接口&#xff0c;而是通过编程控制GPIO引脚的电平状态来实现I…

我在高职教STM32——LCD液晶显示(3)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

前端开发流程与技术选型

目录 一、简介 二、前端职责 三、开发步骤 四、技术选型 五、页面展示 一、简介 做一个网站时&#xff0c;能看到的一切都是前端程序员的工作&#xff0c;负责网页或者app的结构、样式、用户操作网站时的事件逻辑&#xff08;比如点击一个按钮&#xff09;。 二、前端职…

一、系统学习微服务遇到的问题集合

1、启动了nacos服务&#xff0c;没有在注册列表 应该是版本问题 Alibaba-nacos版本 nacos-文档 Spring Cloud Alibaba-中文 Spring-Cloud-Alibaba-英文 Spring-Cloud-Gateway 写的很好的一篇文章 在Spring initial上面配置 start.aliyun.com 重新下载 < 2、 No Feign…

嵌入式系统中的加解密签名

笔者来了解一下嵌入式系统中的加解密 1、背景与名词解释 笔者最近在做安全升级相关的模块&#xff0c;碰到了一些相关的概念和一些应用场景&#xff0c;特来学习记录一下。 1.1 名词解释 对称加密&#xff1a;对称加密是一种加密方法&#xff0c;使用相同的密钥&#xff08;…

力扣刷题 杨辉三角(使用c++ vector解法)

杨辉三角 题目描述示例1示例2提示:代码 题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例1 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例2 …

4、SpringMVC 实战小项目【加法计算器、用户登录、留言板、图书管理系统】

SpringMVC 实战小项目 3.1 加法计算器3.1.1 准备⼯作前端 3.1.2 约定前后端交互接⼝需求分析接⼝定义请求参数:响应数据: 3.1.3 服务器代码 3.2 ⽤⼾登录3.2.1 准备⼯作3.2.2 约定前后端交互接⼝3.2.3 实现服务器端代码 3.3 留⾔板实现服务器端代码 3.4 图书管理系统准备后端 3…