我有一个用于预订电影票的 Java 代码。在这个程序中,每个人只能购买两张票,最多售出 10 张票,最后会显示一个包含人员姓名的列表。我完成了整个过程,初始化并将ArrayList
每个姓名存储在该列表中,但我不知道如何让这个程序在列表本身中检查一个人是否已经购买了两张以上的票。
该计划应以空列表开始,最多可提供 10 张票。
每次迭代时,询问用户是否想要买票。
如果用户想要购买,则询问他们的姓名,如果还有票可用,则将他们添加到列表中。
如果门票已售完,则显示售完信息。
最后,显示所有购买门票的人的名单。
代码如下:
public class BookingTickets{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<String> list = new ArrayList<>();
int ticketsPurchased = 0;
int allTickets = 10;
System.out.print("Do you want to buy a ticket? (y/n): ");
String response = sc.next().toLowerCase();
if (response.equals("n")) {
System.out.println("Thank you. See you next time.");
}
while (response.equals("y")) {
if (ticketsPurchased <= 2) {
if (allTickets == 0) {
System.out.print("Sorry, we have no more tickets!\n");
System.out.println(list);
}
System.out.print("How many tickets do you want to buy? ");
ticketsPurchased = sc.nextInt();
System.out.print("Enter the buyer's name: ");
String name = sc.next();
list.add(name);
allTickets -= ticketsPurchased;
} else {
System.out.print("Limit of 2 tickets per person.");
}
System.out.print("Do you want to buy a ticket? (y/n): ");
response = sc.next().toLowerCase();
}
System.out.println(list);
sc.close();
}
}
该方法计算了中的
Collections.frequency(list, name)
条目数。name
list
它由实用程序类提供
java.util.Collections
。除此之外,您的代码还存在其他问题和一些可能的改进。
问题:
if (ticketsPurchased <= 2)
是错误的。您只能在输入买家姓名后计算已购买的票数 - 然后首先计算列表中出现的次数,如果次数低于 (!) 2,则允许购买。改进:
list
为List<String>
。您实际使用的实现List
对于其余代码来说并不重要,这样,List
如果您需要或想要尝试,可以更轻松地将其交换为其他实现。(List<String> list = new ArrayList<>();
)"Thank you. See you next time."
,而不需要将其放入if
。您遇到的根本问题是,您试图使用单个
int
(ticketsPurchased
) 来跟踪所有买家购买了多少张票。相反,您将需要许多int
s。目前,您可能只想保留一个List<Integer> ticketsPurchased
,其中每个 的索引都Integer
映射到具有相同索引的买家列表中的名称。更复杂的解决方案是创建一个用户类,将姓名和购买的票保存在一个数据结构中。
cyberbrain 的回答是正确的,而且很聪明。
只是为了好玩,下面重写一下你的应用程序,使其更加面向对象。虽然这对初学者来说可能太多了,但这是你学习的方向。
注意关注点分离。我们创建一个类来处理应用程序的各个区域:
Event
&Sale
)TerminalUserInterface
)App
)Event
&Sale
- 领域这些类代表了您的应用程序的核心,是利益相关者在构建软件时真正关心的内容。
这些包含数据(销售清单、剩余票数)以及对这些数据进行操作的代码(增加销售清单、减少剩余票数)。
方便的是,我们可以在使用任何用户界面之前编写测试来锻炼这些类。
TerminalUserInterface
— 用户界面请注意使用辅助方法
makePurchase
将代码分解为更易于管理的块。(以前我们称之为子程序。)App
— 执行生命周期(设置-拆卸)Event
请注意我们如何在启动用户界面之前设置所需的对象(在本例中为对象)。示例运行