Не могу передать ссылку на объект в массив объектов
Изучая Java наткнулся на следующую практическую задачу.
Есть класс, в котором я описываю какие-то поля. Есть другой класс, который по своей сути никак не связан с моим классом, кроме как нескольких операций над объектами другого класса.
Book - класс для описания книги. Lib - класс для "библиотеки" - который добавляет/удаляет их и выводит список всех книг. В main классе я создаю экземпляры Book, а потом хочу добавить их в массив (класс Lib), но передаю я туда только ссылку на объект, а потом уже через методы Lib я должен вывести список книг, которые я добавил. С массивом можно взаимодействовать только через класс Lib, а так-же добавление/удаление из него так же через методы этого класса.
Вот собственно код, который я написал, я его уже пробовал изменять, но иногда у меня выводило 7 книг одинакового названия (по последней книге которую я создал), либо выбрасывается исключение Cannot invoke "Book.getName()" because "b" is null.
public class Lib
{
private static final int MAX_BOOKS = 7;
private Book[] books = new Book[MAX_BOOKS];
public void setBook(Book book)
{
for (Book b : books)
{
b = book;
}
}
public void getNameOfBooks()
{
for (Book b: books)
{
System.out.println(b.getName());
}
}
}
Очень надеюсь на развернутый ответ, так как я только-только начал изучать Java и хотелось бы эту тему хорошо понять, а именно как передать ссылку в массив объектов и потом-же из этого массива считать какое-то поле. Еще такой дополнительный вопрос: как сделать так чтобы массив читался и заполнялся книгами не полностью одним названием, а по мере его вызова? То есть, если я передаю 2 книги из 7, то чтоб 2 были с названием, а остальные null или какое-то дефолтное значение.
Ответы (1 шт):
У вас сейчас проблема в том, что вы нигде не указываете под каким индексом массива вы добавляете новую книжку в массив. Соответственно ваш массив полностью пустой (все значения null). Для вашей задачи идеально подойдет структура данных динамический массив ArrayLisk - тот же массив только размер которого изменяется при добавлении/удалении элементов.
Пример реализации ниже:
public class Test {
public static void main(String[] args) {
Lib lib = new Lib();
Book book1 = new Book();
book1.setName("Java manual");
Book book2 = new Book();
book2.setName("Algoritms");
lib.setBook(book1);
lib.setBook(book2);
lib.getNameOfBooks();
lib.removeBook(book1);
lib.getNameOfBooks();
}
}
class Lib {
private static final int MAX_BOOKS = 7;
private Book[] books = new Book[MAX_BOOKS];
private int current_index = 0;
public void setBook(Book book) {
while (books[current_index] != null) {
current_index++;
}
books[current_index] = book;
current_index = 0;
}
public void removeBook(Book book) {
for (int i = 0; i < books.length; i++)
if ((books[i] != null) && (books[i].getName().equals(book.getName()))) books[i] = null;
}
public void getNameOfBooks() {
for (Book b : books)
if (b != null)
System.out.println(b.getName());
}
}
class Book {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Если вам принципиально использовать именно обычный массив, а не динамический - то программа чуть усложнится (придется прописать вручную часть той логики, которая реализована в классе ArrayList)