#java #arrays #printing #java.util.scanner
#java #массивы #печать #java.util.scanner
Вопрос:
У меня следующая проблема. Пять классов взаимодействуют друг с другом. С двумя темами все в порядке. Но с созданием объекта одного класса (Ticket) в моем главном событии класса (получение пользовательского ввода из другого класса (userInput), обработка этого в кострукторе) у меня теперь проблема с отображением результатов.
Событие основного класса с основным методом
import java.util.ArrayList;
public class Event {
private static String artistName;
private static int artistSalary;
private Language language;
private static ArrayList<String> trackList;
private InputReader inputReader;
private Ticket ticket;
private int amountOfTicketCategories;
private static Object[] ticketList;
private static int index;
public Event() {
}
public Event(Artist artist, Ticket ticket) {
artistName = artist.getArtistName();
artistSalary = artist.getArtistSalary();
trackList = artist.getArrayList();
for (index = 0; index < amountOfTicketCategories; index ) {
ticketList[index] = ticket.getTicket();
ticketList[index].toString();
}
}
public void chooseWhatToDefine() {
language = new Language();
language.whatToSpecify();
}
public void setTicketPrice(String ticketCategory, int ticketPrice) {
}
public void displayArtist(String artistName, int artistSalary) {
language = new Language();
language.displayArtistAndSalary(artistName, artistSalary);
}
public void displayTracklist(ArrayList<String> trackList) {
language = new Language();
language.displayTrackList(trackList);
}
public void displayTickets(Object[] ticketList) {
language = new Language();
language.displayTicket(ticketList);
}
public static void main(String[] args) {
Event event1 = new Event(new Artist(), new Ticket());
event1.displayArtist(artistName, artistSalary);
event1.displayTracklist(trackList);
event1.displayTickets(ticketList);
}
}
Класс Ticket с конструктором, который инициализирует класс с помощью пользовательского ввода, поступающего из класса InputReader, и создает объект из строк и целых чисел.
import java.util.Arrays;
public class Ticket {
private static String ticketCategory;
private static int ticketAmount;
private static int ticketPrice;
private InputReader inputReader;
private int amountOfTicketCategories;
private int index;
private Ticket[] ticketList;
public Ticket(String ticketCategory,int ticketAmount,int ticketPrice) {
}
public Ticket() {
inputReader = new InputReader();
inputReader.specifyTicketCategories();
ticketList = new Ticket[amountOfTicketCategories];
for (index = 0; index < amountOfTicketCategories; index ) {
inputReader.specifyTicket(ticketCategory, ticketAmount, ticketPrice);
ticketList[index] = new Ticket(ticketCategory, ticketAmount, ticketPrice);
}
}
public String toString() {
return("TicketCategory: " ticketCategory "Amount of Tickets: " ticketAmount "Ticket Price: " ticketPrice);
}
public Object getTicket() {
return ticketList[index];
}
public int getAmountOfTicketCategories() {
amountOfTicketCategories = inputReader.specifyTicketCategories();
return amountOfTicketCategories;
}
}
Класс InptReader, который обрабатывает пользовательский ввод:
import java.util.ArrayList;
import java.util.Scanner;
public class InputReader {
private Scanner sc;
private Language language;
private ArrayList <String> tracks;
public InputReader() {
tracks = new ArrayList<String>();
language = new Language();
sc = new Scanner(System.in);
}
public int specifyTicketCategories() {
language.defineAmountOfTicketCategories();
return sc.nextInt();
}
public void specifyTicket(String ticketCategory, int ticketAmount, int ticketPrice) {
language.specifyTicketCategory();
ticketCategory = sc.next();
language.specifyTicketAmount();
ticketAmount = sc.nextInt();
language.specifyTicketPrice();
ticketPrice = sc.nextInt();
}
public int amountOfTickets() {
return sc.nextInt();
}
public int ticketPrice() {
return sc.nextInt();
}
public String readName() {
language.specifyArtist();
return sc.nextLine();
}
public int readInteger() {
language.specifyArtistSalary();
return sc.nextInt();
}
public void addTitle() {
int anzahlSongs = 3;
int index = 0;
while (index < anzahlSongs) {
language.specifyTrackList();
tracks.add(sc.nextLine());
index ;
}
}
public ArrayList<String> getArray() {
return tracks;
}
}
Language class that consists of the language statements
import java.util.ArrayList;
public class Language {
public Language () {
}
public void whatToSpecify() {
System.out.println("What would you like to specify fist? For Artist press 1, for Ticket press 2");
}
public void specifyArtist() {
System.out.println("Who is the artist? ");
}
public void specifyArtistSalary() {
System.out.println("How much does the artist earn? ");
}
public void displayTicket(Object[] ticketList) {
System.out.println("Ticketlist: " ticketList);
}
public void displayArtistAndSalary(String artistName, int artistSalary) {
System.out.println("Artist: " artistName " " "Salary: " artistSalary);
}
public void displayTrackList(ArrayList<String> trackList) {
System.out.println("Tracklist: " trackList);
}
public void specifyTicketCategory() {
System.out.println("What is the ticket category? ");
}
public void specifyTicketAmount() {
System.out.println("What ist the amount of tickets? ");
}
public void specifyTicketPrice() {
System.out.println("What is the price for your ticket?");
}
public void specifyTrackList() {
System.out.println("Add title: ");
}
public void defineAmountOfTicketCategories() {
System.out.println("How many ticket categories you like to set up?");
}
public void line() {
System.out.println("***********************************");
}
}
Класс Artist, который создает экземпляр artist в основном классе (та же идея, что и для ticket), но с другими переменными и параметрами.
import java.util.ArrayList;
public class Artist {
private int artistSalary;
private String artistName;
private InputReader inputReader;
ArrayList <String> trackList;
public Artist() {
inputReader = new InputReader();
artistName = inputReader.readName();
artistSalary = inputReader.readInteger();
inputReader.addTitle();
trackList = inputReader.getArray();
trackList.remove(2);
}
public String getArtistName() {
return artistName;
}
public int getArtistSalary() {
return artistSalary;
}
public ArrayList<String> getArrayList(){
return trackList;
}
}
Вывод в консоль:
Добавить заголовок:
Здравствуйте
Добавить заголовок:
Здравствуйте
Сколько категорий билетов вы хотите настроить?
5
Исполнитель: Дэвид Зарплата: 5000
Список треков: [, Привет]
Ticketlist: null
Ответ №1:
Прежде всего, в конструкторе класса Ticket вы используете другой конструктор (тот, у которого 3 аргумента), который имеет пустое тело.
ticketList[index] = new Ticket(ticketCategory, ticketAmount, ticketPrice);
public Ticket(String ticketCategory,int ticketAmount,int ticketPrice) {
//this is empty
}
Это означает, что вы создаете объект с помощью.. в нем ничего нет (нулевые переменные).
Попробуйте это:
public Ticket(String ticketCategory,int ticketAmount,int ticketPrice) {
this.ticketCategory = ticketCategory;
this.ticketAmount = ticketAmount;
this.ticketPrice = ticketPrice;
}
Тогда ваш метод getTicket неверен. Вы никогда не определяете целое число «index» в своем классе Ticket.
public Object getTicket() {
return ticketList[index];
}
Где «индекс» не определен.
Список билетов не должен находиться в классе билетов => каждый раз, когда вы создаете экземпляр билета, он, вероятно, не будет таким же, как предыдущий.
Комментарии:
1. большое вам спасибо. проблема с ticketList заключается в том, что он использует InputReader, и я создаю новый экземпляр TicketReader в своем конструкторе. вот почему я не могу создать новый объект для чтения входных данных в классе событий, я думаю.
2. Есть много проблем, я думаю, вы можете сделать это лучше. Советы: если вы хотите создать список объектов, не помещайте список внутри самого объекта, а в другой класс (например, DataManager с такими полями, как ticketList, trackList, исполнитель и так далее, с получателями и установщиками). Затем вы можете создать один экземпляр этого класса в своем основном методе при запуске кода.
3. если я делаю это:
public void specifyTicketCategories(int amountOfTicketCategories) { language.defineAmountOfTicketCategories(); amountOfTicketCategories = sc.nextInt();
, создание установщика и получателя в классе диспетчера данныхpublic void setAmountOfTicketCategories(int amountOfTicketCategories) { inputReader.specifyTicketCategories(amountOfTicketCategories); } public int getAmountOfTicketCategories(int amountOfTicketCategories) { return amountOfTicketCategories; }
— это правильно?