Добавление нескольких элементов с помощью связного списка, JAVA
Это вопрос:
Предположим, что у карты есть действующий ПИН-код для запуска и что на банковском счете 100 единиц. Каждое видео имеет стоимость проката. Вам нужно будет отсканировать список корзин и рассчитать сумму транзакции через банкомат. Вы можете предположить, что на банковском счете всегда достаточно единиц, чтобы покрыть стоимость аренды для этого упражнения. Версия кода Video Kiosk будет содержать следующие шаги:
• Создайте связанный список для видео заголовков и заполните выбор из 5 пунктов
• Создать пустой Связанный список (Корзина) для хранения выбора клиента
• Представить процесс выбора по меню
- Отображение на экране с указанием номера выбора
- Определите выбор и определите, является ли он действительным
- Поместить выбранное видео во 2-й связанный список (Корзина)
- Удалить ранее выбранное видео из доступного списка заголовков
Полный процесс выбора
Принесите содержимое списка корзины в банкомат и оплатите
Vkiosk.java
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
public class VKiosk {
private static LinkedList VTable=new LinkedList();
private static LinkedList Basket=new LinkedList();
private static double rentCost=0;
private static int j=1;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// declaring scanner name as "typeNumber"
Scanner typeNumber = new Scanner(System.in);
System.out.println("::: Welcome to My Java Program To model an ATM machine :::");
showVideoList();
System.out.print("Input the serial number of video to buy: ");
buyVideo();
System.out.println("Your total amount of Cost: "+ rentCost);
MMachine buy = new MMachine();
buy.Txn(rentCost);
}
public static double buyVideo(){
Scanner typeNumber = new Scanner(System.in);
String title=typeNumber.nextLine();
String amount=null;
for(int i=0;i<VTable.size();i++){
String videoDetails=VTable.get(i).toString();
if(videoDetails.toLowerCase().contains(title.toLowerCase())){
Basket.add(VTable.get(i));
for(int j=videoDetails.length()-2;j>=0;j--){
if(videoDetails.charAt(j)==' '){
break;
}
amount=videoDetails.substring(j, videoDetails.length()-1);
}
VTable.remove(i);
}
}
rentCost=Double.parseDouble(amount);
return rentCost;
}
public static void VideoList(){
Video vTable1=new Video("BladeRunner", 1, 5);
Video vTable2=new Video("Wages of Fear", 2, 4);
Video vTable3=new Video("Grease", 3, 5);
Video vTable4=new Video("Mama Mia", 4, 4);
Video vTable5=new Video("L'Illusionniste", 5, 6);
VTable.add(vTable1);
VTable.add(vTable2);
VTable.add(vTable3);
VTable.add(vTable4);
VTable.add(vTable5);
}
public static void showVideoList(){
System.out.println();
System.out.println("********************************************************************");
System.out.println("List of the Videos are: ");
System.out.println("********************************************************************");
System.out.println("Serial No Video Detetails");
VideoList();
for(int i=0; i<VTable.size(); i++){
System.out.println( j+" "+VTable.get(i));
j++;
}
System.out.println();
}
}
Video.java
public class Video{
private String title;
private int serial;
private double cost;
public Video(String title, int serial, double cost)
{
this.title = title;
this.serial = serial;
this.cost = cost;
}
public String getTitle() {return title;}
public int getSerial() {return serial;}
public double getCost() {return cost;}
public String getVideo() {
return "title:" + title + " Serial: " + serial + " Cost: " + cost;
}
// Upgrade output of toString ()
@Override
public String toString() {
return "["+getVideo()+"]";
}
}
Мне удалось купить только один товар, мне нужно купить несколько товаров через корзину связанного списка.
1 ответ
Причина, по которой совершается только одна покупка, заключается в том, что у вас нет петли для попытки приобрести (или арендовать; номенклатура немного запутана) дополнительные выборы. Есть также некоторые static
переменные класса, которые делают процедуру немного более сложной. Вот некоторые предложения.
Основной метод
Добавьте цикл для сбора дополнительных входных данных. Кроме того, удалите static double rentCost
и перейдите к основному методу (также измените buyVideo для возврата стоимости вместо обновления переменной экземпляра). Добавьте метод, чтобы продолжить собирать данные.
private static boolean purchaseAnother(Scanner stdin)
{
while (true) {
System.out.println();
System.out.println("Purchase another (y/n): ");
String chk = stdin.nextLine();
if (chk != null && chk.trim().length() > 0) {
if (chk.toLowerCase().equals("y")) { return true; }
if (chk.toLowerCase().equals("n")) { return false; }
}
}
}
/**
* @param args
* the command line arguments
*/
public static void main(String[] args)
{
// declaring scanner name as "typeNumber"
Scanner typeNumber = new Scanner(System.in);
System.out.println(
"::: Welcome to My Java Program To model an ATM machine :::");
boolean buyMore = true;
// **ADD: initialize the video list only once
VideoList();
// **USE LOCAL VARIABLE FOR COST
double rentCost = 0.0d;
while (buyMore) {
showVideoList();
System.out.print("Input the serial number of video to buy: ");
//**ACCUMULATE THE TOTAL COST
rentCost += buyVideo();
System.out.printf("Current total $%.2f", rentCost);
// SEE IF WISH TO KEEP GOING IF THERE IS ANYTHING LEFT TO RENT
buyMore = (! VTable.isEmpty() && purchaseAnother(typeNumber));
}
// actually make a purchase
// ADD STATEMENT, but this might be in the MMachine class; unknown
System.out.printf("Charging $%.2f to the Debit Card%n", rentCost);
MMachine buy = new MMachine();
buy.Txn(rentCost);
System.out.println("Have a nice day!");
}
Метод BuyVideo
Изменить, чтобы вернуть сумму аренды; не обновлять переменную экземпляра
public static double buyVideo()
{
Scanner typeNumber = new Scanner(System.in);
String title = typeNumber.nextLine();
String amount = null;
for (int i = 0; i < VTable.size(); i++) {
String videoDetails = VTable.get(i).toString();
if (videoDetails.toLowerCase().contains(title.toLowerCase())) {
Basket.add(VTable.get(i));
for (int j = videoDetails.length() - 2; j >= 0; j--) {
if (videoDetails.charAt(j) == ' ') {
break;
}
amount = videoDetails.substring(j,
videoDetails.length() - 1);
}
// ** ADD LINE TO INDICATE ACTION
System.out.println("Purchasing: " + VTable.remove(i).getTitle());
}
}
// ** CHANGE TO USE A LOCAL VARIABLE AND RETURN IT
double videoRentCost = Double.parseDouble(amount);
return videoRentCost;
}
метод showVideoList
Удалить VideoList()
вызов - инициализируйте список аренды только один раз в main()
метод. Кроме того, рассмотрите возможность очистки выходного форматирования немного.
public static void showVideoList()
{
System.out.println();
System.out.println(
"********************************************************************");
System.out.println("List of the Videos are: ");
System.out.println(
"********************************************************************");
// **USE PRINTF TO GIVE BETTER FORMATTING
System.out.printf("%10s %53s%n","Serial No","Video Details");
for (int i = 0; i < VTable.size(); i++) {
// **USE SIMILAR FORMATTING OUTPUT
System.out.printf("%10d %53s%n", VTable.get(i).getSerial(), VTable.get(i));
}
System.out.println();
}
Это изменение даст представление как:
********************************************************************
List of the Videos are:
********************************************************************
Serial No Video Details
1 [title:BladeRunner Serial: 1 Cost: 5.0]
2 [title:Wages of Fear Serial: 2 Cost: 4.0]
3 [title:Grease Serial: 3 Cost: 5.0]
4 [title:Mama Mia Serial: 4 Cost: 4.0]
5 [title:L'Illusionniste Serial: 5 Cost: 6.0]