Создание отношения между двумя объектами ArrayList - PullRequest
0 голосов
/ 10 мая 2019

У меня есть два ArrayLists, moviesAvailable и moviesRented в классе с именем Catalogue, и у меня есть еще один ArrayList с именем currentlyRented в классе с именем Customer.Я хочу, чтобы moviesRented и currentlyRented были связаны, чтобы у одного Customer можно было взять напрокат много фильмов.

У меня есть код, так что когда клиент арендует фильм, этот фильм удаляется изmoviesAvailable класс и добавление к moviesRented классу.Я хочу, чтобы у каждого клиента был список currentlyRented.

Класс Catalogue:

null

Класс Customer:

null

Когда я запускаю полную программу, происходит, если я ввожуклиент id и title фильма, он арендует фильм.Когда я арендую другой, используя другой id, он снова арендует.Однако, когда я ввожу клиента id для возврата фильма, в нем перечислены фильмы обоих клиентов.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Вы дублируете поведение аренды / возврата фильма в Customer и Catalog.Выберите один, а затем управляйте содержимым всех списков оттуда.Вот пример реализации, где Customer выполняет операции:

class Movie {

    String title;

    public Movie(String title) {
        this.title = title;
    }
    // equals, hashCode, toString
}

class Catalog {

    public static final List<Movie> moviesAvailable = new ArrayList<>();
    public static final List<Movie> moviesRented = new ArrayList<>();
}

class Customer {

    private List<Movie> currentlyRented = new ArrayList<>();
    private List<Movie> rentingHistory = new ArrayList<>();

    public void rentMovie(String title) {
        Movie movie = new Movie(title);
        if (Catalog.moviesAvailable.remove(movie)) {
            Catalog.moviesRented.add(movie);
            currentlyRented.add(movie);
            System.out.println("Movie " + movie + " was rented to " + this);
        } else {
            System.out.println("Movie " + movie + " is not available");
        }
    }

    public void returnMovie(String title) {
        Movie movie = new Movie(title);
        if (currentlyRented.remove(movie)) {
            rentingHistory.add(movie);
            Catalog.moviesRented.remove(movie);
            Catalog.moviesAvailable.add(movie);
            System.out.println("Movie " + movie + " was returned by " + this);
        } else {
            System.out.println("Movie " + movie + " is not being rented by " + this);
        }
    }
}

Поскольку существует только один Catalog, либо сделайте его одноэлементным, либо используйте подход статических членов, как показано выше (что проще),Если вы будете осторожны, все списки будут правильно синхронизированы.Однако такой подход позволяет изменять списки каталогов вне методов заказчика.Тогда даже если currentlyRented содержит фильм, Catalog.moviesRented не может.Есть другие варианты, которые могут устранить эту проблему, но это выходит за рамки этого вопроса.

0 голосов
/ 10 мая 2019

Я думаю, что было бы лучше разработать класс «Прокат», который содержал бы «Кино и покупателя» (или список покупателей, если каждый фильм мог бы арендовать более одного покупателя).Тогда ваш класс Каталога может иметь список прокатов для всех клиентов и список фильмов (все они, взятые напрокат или нет).Таким образом, вы можете выполнять итерацию по всем классам аренды вашего каталога и возвращать только те, которые относятся к определенному идентификатору клиента и т. Д.

...