Tenho um código Java para reservar ingressos de cinema. Neste programa, cada pessoa só pode comprar dois ingressos, são vendidos no máximo 10 ingressos e no final ele exibe uma lista com os nomes das pessoas. Fiz todo o processo onde inicializei com ArrayList
e armazenando cada nome dentro dessa lista, mas não tenho ideia de como fazer esse programa verificar dentro da própria lista se uma pessoa já comprou mais de dois ingressos.
O programa deve começar com uma lista vazia e um máximo de 10 ingressos disponíveis.
A cada iteração, pergunte ao usuário se ele deseja comprar um ingresso.
Se o usuário quiser comprar, pergunte o nome dele e adicione-o à lista se ainda houver ingressos disponíveis.
Se os ingressos estiverem esgotados, exiba uma mensagem de esgotado.
No final, exiba a lista de todas as pessoas que compraram ingressos.
Aqui está o código:
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();
}
}
O Método
Collections.frequency(list, name)
conta o número de entradasname
nolist
.É fornecido pela classe de utilitário
java.util.Collections
.Além disso, seu código tem outros problemas e diversas melhorias possíveis.
Problemas:
if (ticketsPurchased <= 2)
está errado. Você só pode contar os ingressos já comprados, depois que o nome do comprador for inserido - e então primeiro contar as ocorrências na lista e se for menor(!) que 2, deixe a compra acontecer.Melhorias:
list
somente comoList<String>
. Qual implementação deList
você realmente usa não importa para o resto do código e dessa forma é mais fácil trocar por outras implementações deList
se você precisar ou quiser experimentar. (List<String> list = new ArrayList<>();
)"Thank you. See you next time."
simplesmente após o loop, não precisa colocá-la em umif
.O problema fundamental que você tem é que está tentando usar um único
int
(ticketsPurchased
) para manter o controle de quantos ingressos todos os compradores compraram. Em vez disso, você vai precisar de muitosint
s. Por enquanto, você pode querer manter apenas umList<Integer> ticketsPurchased
, onde o índice de cadaInteger
mapeia para o nome na lista de compradores com o mesmo índice.Uma solução mais sofisticada seria criar uma classe Usuário para manter o nome e os ingressos comprados juntos em uma única estrutura de dados.
A resposta do cyberbrain está correta e é inteligente.
Só por diversão, aqui está uma reescrita do seu aplicativo para ser mais orientado a objetos . Embora isso possa ser demais para um aluno iniciante, esta é a direção para seguir em seu aprendizado.
Observe a separação de interesses . Criamos uma classe para lidar com as áreas do seu aplicativo:
Event
&Sale
)TerminalUserInterface
)App
)Event
&Sale
— domínioEssas classes representam o núcleo do seu aplicativo, o que realmente importa para as partes interessadas ao criar seu software.
Eles contêm dados (lista de vendas, contagem de ingressos restantes), bem como o código que opera sobre esses dados (adição à lista de vendas, diminuição da contagem de ingressos restantes).
Convenientemente, poderíamos escrever testes para exercitar essas classes antes de nos preocuparmos com qualquer interface de usuário.
TerminalUserInterface
— interface do usuárioObserve o uso de um método auxiliar
makePurchase
para dividir o código em partes mais gerenciáveis. (Antigamente, chamávamos isso de sub-rotina .)App
— ciclo de vida de execução (configuração-desmontagem)Observe como configuramos os objetos necessários, neste caso um
Event
objeto, antes de iniciar a interface do usuário.Exemplo de execução