在两个ArrayList对象之间创建关系

时间:2019-05-10 06:51:58

标签: java collections relationship

在名为ArrayLists的类中,我有两个moviesAvailablemoviesRentedCatalogue,而在另一个课程中,我还有另一个ArrayList,名为currentlyRented名为Customer的类。我希望将moviesRentedcurrentlyRented关联起来,以便一个Customer可以租借许多电影。

我有代码,以便当客户租借电影时,该电影将从moviesAvailable类中删除,并添加到moviesRented类中。我希望每个客户都有一个currentlyRented列表。

Catalogue类:

null

Customer类:

null

当我运行完整程序时,发生的情况是,如果我输入客户id,并且电影的title会租借电影。当我使用其他id租用另一台时,它再次租用。但是,当我输入客户id返回电影时,它会列出两个客户的电影。

2 个答案:

答案 0 :(得分:1)

您正在复制CustomerCatalog中租借/归还电影的行为。选择一个,然后从那里管理所有列表内容。这是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也可能不会。还有其他设计可以消除此问题,但这超出了此问题的范围。

答案 1 :(得分:0)

我认为最好也设置一个租赁类,该类可以容纳一个电影和一个客户(如果每部电影可以由一个以上的客户租用,则可以列出一个客户列表)。 然后,您的Catalog类可能具有“所有客户的租借”列表和“电影”列表(所有租借或未租借的电影)。 这样,您可以遍历Catalog类的所有Rentals,并仅返回适用于特定客户ID的那些。