Это будет довольно долго, но, надеюсь, это поможет вам.
Во-первых, вы должны поместить в свой класс Book
метод, который будет запрашивать у авторов авторов, и добавлять любого из введенныхавторы list
для этого объекта.
Вот как будет выглядеть этот класс вместе с main
, предназначенным только для тестирования. Я исключил все остальные ваши поля:
public class Book {
ArrayList<Author> authors = new ArrayList<>();
public Book() {
}
public Book(String title, int copyright, int edition, String isbn, ArrayList<Author> authors) {
/*
I left these fields out of this example on purpose.
this.title = title;
this.copyright = copyright;
this.edition = edition;
this.isbn = isbn; */
this.authors = authors;
}
public void promptForAuthors()
{
Scanner scan = new Scanner(System.in);
String response = "Y";
do {
System.out.println("Please enter the author. ");
String input = scan.nextLine();
String [] splitAuthors = input.split(" ");
Author author = new Author(splitAuthors[0], splitAuthors[1]);
if (!this.authors.contains(author)) {
this.authors.add(author);
}
System.out.println("Would you like you add an additional author? (Y or N) ");
response = scan.nextLine();
} while(response.equalsIgnoreCase("Y"));
}
public void printAuthors() {
for (Author a : this.authors) {
System.out.println(a.getFirstName() + " " + a.getLastName());
}
}
public static void main(String[] args) {
Book b = new Book(); //This will normally be the constructor that includes the ISBN, copyright, etc.
b.promptForAuthors();
b.printAuthors();
}
}
Из main
видно, как вы должны использовать это в своем коде addBooks
. По сути, вы создаете Book
из всех других полей, которые вы использовали в качестве входных данных, затем вы можете вызвать этот метод для этого объекта.
Возможно, вам понадобится изменить ваш текущий конструктор, чтобы он больше не требовал ввода list
для авторов при построении, чтобы вы могли использовать его позже (вы можете просто иметь оба доступных конструктора).
promptForAuthors()
будет продолжать предлагать пользователю ввести Author
, пока он не нажмет что-либо кроме Y
или y
.
Этот метод всегда запрашивает автора как минимум один раз из-за использования цикла do-while
. Одним из главных преимуществ этого в самом классе Book
является то, что этот метод можно использовать в любое время, чтобы добавить больше авторов к той же книге в будущем, если это в конечном итоге потребуется.
Дополнительно, метод будет использовать .contains()
, чтобы проверить, существует ли Author
внутри list
, и добавить Author
, только если это новый Author
. Для этого требуется Override
из .hashCode()
и .equals()
в вашем Author
классе, который вы можете найти тот, который я сделал ниже:
//IN THE AUTHOR CLASS PLACE THESE METHODS AND MODIFY FOR EXTRA FIELDS
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Author)) {
return false;
}
Author user = (Author) o;
return user.firstName.equals(this.firstName) &&
user.lastName.equals(this.lastName);
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + this.firstName.hashCode();
result = 31 * result + this.lastName.hashCode();
return result;
}
Примечание: Я включилprintAuthors()
метод, так же как простой способ проверить, не были ли добавлены лишние дубликаты Authors
.
Пример Запуск добавления Авторы:
Please enter the author.
Joe Smith
Would you like you add an additional author? (Y or N)
y
Please enter the author.
Billy Bob
Would you like you add an additional author? (Y or N)
n
Joe Smith
Billy Bob