在名为ArrayLists
的类中,我有两个moviesAvailable
,moviesRented
和Catalogue
,而在另一个课程中,我还有另一个ArrayList
,名为currentlyRented
名为Customer
的类。我希望将moviesRented
和currentlyRented
关联起来,以便一个Customer
可以租借许多电影。
我有代码,以便当客户租借电影时,该电影将从moviesAvailable
类中删除,并添加到moviesRented
类中。我希望每个客户都有一个currentlyRented
列表。
Catalogue
类:
null
Customer
类:
null
当我运行完整程序时,发生的情况是,如果我输入客户id
,并且电影的title
会租借电影。当我使用其他id
租用另一台时,它再次租用。但是,当我输入客户id
返回电影时,它会列出两个客户的电影。
答案 0 :(得分:1)
您正在复制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
也可能不会。还有其他设计可以消除此问题,但这超出了此问题的范围。
答案 1 :(得分:0)
我认为最好也设置一个租赁类,该类可以容纳一个电影和一个客户(如果每部电影可以由一个以上的客户租用,则可以列出一个客户列表)。 然后,您的Catalog类可能具有“所有客户的租借”列表和“电影”列表(所有租借或未租借的电影)。 这样,您可以遍历Catalog类的所有Rentals,并仅返回适用于特定客户ID的那些。