Не могу передать ссылку на объект в массив объектов

Изучая 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 шт):

Автор решения: had0uken

У вас сейчас проблема в том, что вы нигде не указываете под каким индексом массива вы добавляете новую книжку в массив. Соответственно ваш массив полностью пустой (все значения 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)

→ Ссылка