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

Java电影票预订程序:如何检测用户是否已购买最大限额票数?

Java电影票预订程序:如何检测用户是否已购买最大限额票数?

嘿,我看了你的代码和需求,发现核心问题在于你目前用的ArrayList<String>只能记录购票者的名字,但没法跟踪每个用户累计买了多少张票。咱们来一步步修复这个问题,同时把原代码里的逻辑漏洞也补上!

先说说原代码里的几个小问题

  1. 你用ticketsPurchased来存储用户当前想买的票数,但判断条件ticketsPurchased <= 2完全没起到“检测用户累计购票数”的作用——它只是在检查用户这次想买的数量,不是这个用户总共买了多少。
  2. 当用户买多张票时,你只往列表里加了一次名字,这样最后显示的名单没法准确对应票数(比如用户买2张,列表里应该出现两次他的名字才对,或者用统计的方式展示)。
  3. 循环里的逻辑顺序有问题:比如你先判断ticketsPurchased <=2,但这个变量此时还是上一次的值,逻辑完全颠倒了。

解决方案:用HashMap跟踪每个用户的累计购票数

咱们可以用HashMap<String, Integer>来记录每个用户的总购票数——键是用户名,值是该用户已经买的票数。这样每次用户购票时,就能先查这个Map,判断加上这次想买的票数会不会超过2张的限额。

下面是修改后的完整代码,我加了详细注释:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class BookingTickets {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 用来记录每张票的购买者(最后要展示的列表)
        ArrayList<String> ticketBuyers = new ArrayList<>();
        // 用来跟踪每个用户累计买了多少张票:键=用户名,值=累计票数
        HashMap<String, Integer> userTicketCount = new HashMap<>();

        int totalTicketsAvailable = 10; // 总票数
        String response;

        do {
            System.out.print("Do you want to buy a ticket? (y/n): ");
            response = sc.next().toLowerCase();

            if (response.equals("n")) {
                System.out.println("Thank you. See you next time.");
                break;
            }

            // 先检查票是否售罄
            if (totalTicketsAvailable == 0) {
                System.out.println("Sorry, we have no more tickets!");
                break;
            }

            // 获取用户想买的票数
            System.out.print("How many tickets do you want to buy? (1-2): ");
            int ticketsToBuy = sc.nextInt();
            sc.nextLine(); // 吃掉换行符,避免影响后续输入

            // 先验证本次购票数量是否合法(1或2,且不超过剩余票数)
            if (ticketsToBuy < 1 || ticketsToBuy > 2) {
                System.out.println("You can only buy 1 or 2 tickets at a time.");
                continue;
            }
            if (ticketsToBuy > totalTicketsAvailable) {
                System.out.println("Sorry, only " + totalTicketsAvailable + " tickets left.");
                continue;
            }

            // 获取用户名
            System.out.print("Enter the buyer's name: ");
            String name = sc.nextLine().trim();

            // 检查该用户累计购票数
            int currentCount = userTicketCount.getOrDefault(name, 0);
            if (currentCount + ticketsToBuy > 2) {
                System.out.println("Limit of 2 tickets per person. You have already bought " + currentCount + " tickets.");
                continue;
            }

            // 一切合法,更新数据
            userTicketCount.put(name, currentCount + ticketsToBuy);
            totalTicketsAvailable -= ticketsToBuy;
            // 往列表里添加对应次数的名字(每张票对应一个条目)
            for (int i = 0; i < ticketsToBuy; i++) {
                ticketBuyers.add(name);
            }

            System.out.println("Successfully purchased " + ticketsToBuy + " ticket(s)!");

        } while (true);

        // 展示所有购票者名单
        System.out.println("\nList of all people who bought tickets:");
        System.out.println(ticketBuyers);

        sc.close();
    }
}

关键修改点说明

  1. HashMap<String, Integer>的使用:通过它我们能快速查到任意用户已经买了多少张票,getOrDefault(name, 0)表示如果用户没买过票,就默认返回0。
  2. 输入验证:先检查用户这次想买的票数是不是1或2,以及是否超过剩余票数,避免无效操作。
  3. 累计票数判断:计算currentCount + ticketsToBuy,如果超过2就阻止购票,同时提示用户已买的数量。
  4. 名单更新:用户买几张票,就往ticketBuyers列表里加几次名字,这样最后展示的列表能准确反映每张票的购买者。

测试场景举例

  • 同一个用户第一次买2张:成功,列表里会有两个他的名字,Map里他的计数是2。
  • 这个用户再想买1张:会提示“每人最多2张,你已经买了2张”。
  • 剩余票数只剩1张时,用户想买2张:会提示“只剩1张票了”。
  • 所有票卖完后,再进入循环会直接提示售罄。

备注:内容来源于stack exchange,提问作者Cleyton Melo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:38:07