Создание и печать объекта, который хранит строки и целые числа в Java

#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; } — это правильно?