[РЕДАКТИРОВАТЬ: я решил проблему. Мне просто нужно сделать массивы статическими. Не могу поверить, что я этого не делал. Спасибо всем за помощь!]
У меня есть программа книжного магазина, где люди могут купить максимум 5 разных книг. Как только они выберут заголовок, он будет добавлен в массив для счета позже. Выбор заголовков и помещение их в массив находится в двух разных классах. На пробу покупаю 2 книги: Атлетика и Автоспорт.
Ожидаемый результат:
You bought 2 book(s)!
1) Athletics Weekly Magazine
2) Autosport Magazine
Отредактированный List.java: я пробовал обе вещи. Сначала меняется на i-1
В SportsMag.java:
import java.util.Scanner;
public class SportMag extends Magazine{
Scanner scan = new Scanner(System.in);
public void title() {
System.out.println("");
System.out.println("What do you want to buy?");
System.out.println("1. Athletics Weekly");
System.out.println("2. Autosport");
int choice = scan.nextInt();
List l = new List();
if (choice==1) {
l.totalbooks(1);
l.booknames(1,"Athletics Weekly", "Magazine");
} else {
l.totalbooks(1);
l.booknames(1,"Autosport", "Magazine");
}
System.out.println("Do you want to go back to menu? (Yes/No)");
String back = scan.next();
if (back.equalsIgnoreCase("Yes")) {
BookType b = new BookType();
b.bookMenu();
}
if (back.equalsIgnoreCase("No")) {
l.printInvoice();
}
}
}
В List.java (где я печатаю счет):
public class List {
static int total=0;
public void totalbooks(int num) {
total+=num;
}
String[] bookname = new String[5];
String[] booktype = new String[5];
static int a=0;
public void booknames(String newBookName, String newBookType) {
bookname[a]=newBookName;
booktype[a]=newBookType;
a++;
}
public void printInvoice() {
System.out.println("You bought "+total+" book(s).");
for (int i=0; i<total; i+=1) {
System.out.println((i+1)+") "+bookname[i]+" "+booktype[i]);
}
}
}
Результат для этого:
You bought 2 book(s).
1) null null
2) Autosport Magazine
Я также пытался использовать ArrayList
:
В СпортМаг.Ява:
//same as above, only a little difference here
List l = new List();
if (choice==1) {
l.totalbooks(1);
bookname.add("Athletics Weekly");
} else {
l.totalbooks(1);
bookname.add("Autosport");
}
В List.java:
ArrayList<String> bookname = new ArrayList<String>();
public void printInvoice() {
System.out.println("You bought "+total+" book(s).");
for (int i=0; i<total; i+=1) {
System.out.println(bookname.get(i));
}
}
Я получил ошибку в SportMag.java, которая говорит bookname cannot be resolved
. Предлагаемое быстрое исправление состояло в том, чтобы создать локальную переменную bookname, но тогда она не попадет в массив в List.java.
Я не узнал об ArrayList, поэтому я не совсем уверен, что здесь делать.
Я также попытался сделать другую версию, в которой все находится в основном методе и вызывает только методы в других классах для отображения заголовков, фактически не сканируя ввод в других методах. Я сделал это, чтобы никакие объекты не умирали после каждой функции. Основной стал очень длинным.
Я не знаю, нормально ли это работает для 2 книг, потому что я не могу зацикливаться, так как все в основном.
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
BookType b = new BookType();
List l = new List();
b.bookMenu();
int booktypechoice = scan.nextInt();
if (booktypechoice ==1) {
Magazine mag = new Magazine();
mag.magtype();
int magtypechoice = scan.nextInt();
if (magtypechoice==1) {
SportMag smag = new SportMag();
smag.title();
int smagchoice = scan.nextInt();
SportMag sportmag = new SportMag();
if (smagchoice==1) {
l.totalbooks(1);
l.booknames("Athletics Weekly", "Magazine");
System.out.println("Do you want to go back to menu? (Yes/No)");
String goback = scan.next();
if (goback.equalsIgnoreCase("Yes")) {
b.bookMenu();
}
if (goback.equalsIgnoreCase("No")) {
l.printInvoice();
}
} else {
l.totalbooks(1);
l.booknames("Autosport", "Magazine");
System.out.println("Do you want to go back to menu? (Yes/No)");
String goback = scan.next();
if (goback.equalsIgnoreCase("Yes")) {
b.bookMenu();
}
if (goback.equalsIgnoreCase("No")) {
l.printInvoice();
}
}
} else {
//all the other book choices goes here.
//It's really long, but it's just like sportmag up there
}
}
}
}
Как ввести названия книг в массив и правильно их отобразить?
1 ответ
Я думаю, у вас проблемы с областью действия переменной List l
. Вы создаете эту переменную внутри функции title
и работаете с ней, подставляя в нее запрошенный клиентом товар. Но тогда куда девается переменная? Он просто умирает в конце функции. Этот объект должен быть в области, которая будет существовать до тех пор, пока он интересен.
Например, вы можете преобразовать эту переменную в свойство вашего основного класса. Это может быть даже статический класс. Вы должны найти лучший способ сохранить ваш объект List
. Как бы то ни было, он умирает, как только заканчивается функция title
.
total
и забыл изменить его. Я изменил его на i-1
, и теперь вывод 1) Autosport (Magazine) 2) null (null)
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
ArrayList<String> bookname = new ArrayList<String>();
, но не могу использоватьbookname.add("Autosport");
в другом классе. Это выдаст ошибку, чтоbookname
не может быть разрешен. Когда я попытался использовать метод специально для добавления имени, он по-прежнему дает ту же ошибку.