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



我在一个名为 Catalogue的类中有两个 ArrayListsmoviesAvailablemoviesRented,我在一个名为 Customer的类中有另一个称为 currentlyRentedArrayList。我希望moviesRentedcurrentlyRented关联,以便一部Customer可以租用许多电影。

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

Catalogue类:

private Kiosk kiosk;
private List<Movie> moviesAvailable = new ArrayList<>();
private List<Movie> moviesRented =  new ArrayList<>();
private List<Genre> genres =  new ArrayList<>();
public void rentMovie(int id, String title) {
    Movie mov = movie(title);
    if(mov.hasType(title))
        moviesRented.add(mov);
        moviesAvailable.removeIf(movie -> movie.hasType(title));
        System.out.println("Movie rented.n");
}
public Movie movie(String title) {
    for(Movie movie : moviesAvailable)
        if(movie.hasType(title))
            return movie;
    return null;
}
public void returnMovie(int id, String title) {
    Movie mov = movie(title);
        moviesRented.removeIf(movie -> movie.hasType(title));
        moviesAvailable.add(mov);
        System.out.println(title + " has been returned.");
}

Customer类:

private int ID;
private String name;
private int balance;
private List<Movie> currentlyRented = new ArrayList<>();
private List<Movie> rentingHistory = new ArrayList<>();
public Customer(int ID, String name, int balance) {
    this.ID = ID;
    this.name = name;
    this.balance = balance;
}
public boolean hasType(int id) {
    return id == (this.ID);
}
public void movie(int id, String title) {
    Movie movie = movie(title);
        currentlyRented.add(movie);
        rentingHistory.add(movie);
}
public void returnMovie(int id, String title) {
    Movie mov = movie(title);
    if(mov.hasType(title))
        currentlyRented.removeIf(movie -> movie.hasType(title));
}
public Movie movie(String title) {
    for(Movie movie : currentlyRented)
        if(movie.hasType(title))
            return movie;
    return null;
}
public void rents() {
    System.out.println(name + " has the following movies: " );
    System.out.println("Movies currently rented by " + name + ":");
}

当我运行完整程序时,会发生什么是如果我输入客户id和电影的title,则会租用电影。当我使用其他id租用另一个租金时,它再次租用。但是,当我输入客户id返回电影时,它列出了两个客户的电影。

您正在复制在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也可能不会。还有其他可以消除此问题的设计,但这是这个问题的范围。

我认为参加租赁课程也将是更好的设计,它将容纳电影和客户(如果每部电影都可以租用多个以上,则是客户列表顾客(。然后,您的目录课可以为所有客户提供租金列表,以及电影列表(所有租金(。这样,您可以迭代目录类的所有租金,并仅返回适用于特定客户ID等的租金。

最新更新