Java电影票预订程序:如何检测用户是否已购买最大限额票数?
Java电影票预订程序:如何检测用户是否已购买最大限额票数?
嘿,我看了你的代码和需求,发现核心问题在于你目前用的ArrayList<String>只能记录购票者的名字,但没法跟踪每个用户累计买了多少张票。咱们来一步步修复这个问题,同时把原代码里的逻辑漏洞也补上!
先说说原代码里的几个小问题
- 你用
ticketsPurchased来存储用户当前想买的票数,但判断条件ticketsPurchased <= 2完全没起到“检测用户累计购票数”的作用——它只是在检查用户这次想买的数量,不是这个用户总共买了多少。 - 当用户买多张票时,你只往列表里加了一次名字,这样最后显示的名单没法准确对应票数(比如用户买2张,列表里应该出现两次他的名字才对,或者用统计的方式展示)。
- 循环里的逻辑顺序有问题:比如你先判断
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(); } }
关键修改点说明
HashMap<String, Integer>的使用:通过它我们能快速查到任意用户已经买了多少张票,getOrDefault(name, 0)表示如果用户没买过票,就默认返回0。- 输入验证:先检查用户这次想买的票数是不是1或2,以及是否超过剩余票数,避免无效操作。
- 累计票数判断:计算
currentCount + ticketsToBuy,如果超过2就阻止购票,同时提示用户已买的数量。 - 名单更新:用户买几张票,就往
ticketBuyers列表里加几次名字,这样最后展示的列表能准确反映每张票的购买者。
测试场景举例
- 同一个用户第一次买2张:成功,列表里会有两个他的名字,Map里他的计数是2。
- 这个用户再想买1张:会提示“每人最多2张,你已经买了2张”。
- 剩余票数只剩1张时,用户想买2张:会提示“只剩1张票了”。
- 所有票卖完后,再进入循环会直接提示售罄。
备注:内容来源于stack exchange,提问作者Cleyton Melo
相关产品推荐
相关产品推荐

