我有一个代码从列表中选出项目,我有一个扫描程序浏览文件(每行有电影和演员)并将电影添加到数组中。我如何制作它,以便它添加到arraylist的每一部电影也存储在线后的演员?例如: 一行将是电影名称(日期)/ LastName,FirstName / Lastname2,Firstname2 /等等。我的代码包括一个类Movie,它将Movie Name变成一个字符串。我怎样才能在任何一个点上搜索任何一部电影并让它拉出所有出演的演员呢?
public void loadDataFromFile(String fileName){
/**
* This method takes in one parameter, a file name, and prints out the data from that file
*/
Scanner theScanner3 = null;
myMovies = new ArrayList<Movie>();
try{
theScanner3 = new Scanner(new FileInputStream(fileName));}
catch(Exception ex){
System.err.println("IndexOutOfBoundsException: " + ex.getMessage());
}
while( theScanner3.hasNextLine()){
int i = 1;
i = i+1;
Movie foo = new Movie(theScanner3.nextLine());
myMovies.add(foo);
}
theScanner3.close();
}
我需要能够搜索一个电影的名字并让它回到我与该电影在同一行的每个演员。但是,我不知道如何做到这一点。
答案 0 :(得分:1)
您不想将myMovies设置为ArrayList,而是将其设置为Map。 但在此之前,您需要创建一个单独的ArrayList,其中包含该影片的actor。 所以它将是:
ArrayList<String> actors = new ArrayList<String>();
然后:
Map<Movie, ArrayList<String>> myMovies = new HashMap<Movie, ArrayList<String>>();
您希望在读取所有行之前创建myMovies,如果您想随时访问它,甚至可以将其设置为全局变量。 为了获得该特定电影的所有演员,您将执行以下操作:
ArrayList<String> movieActors = myMovies.get([movie_object]);
String firstActor = movieActors.get(0);
例如:
Map<Movie, ArrayList<String>> myMovies = new HashMap<Movie, ArrayList<String>>();
...
while(theScanner3.hasNextLine()) {
int i = 1;
i += 1
ArrayList<String> actors = new ArrayList<String>();
//
//do some splits using delimiters to separate out name of the movie and actors
//for example, let's say the strings are in an array called 'split'
//where split[0] is the movie title
//and everything that follows afterwards are the actor names
//
String movieName = split[0]
for(int j = 1; j < split.length; j++) {
actors.add(split[j]);
}
//creating the objects
Movies foo = new Movie(movieName);
//now to store the movie and the arraylist of actors into myMovies
myMovies.put(foo, actors);
...
实现此目的的另一种方法是在Movie对象中包含actor名称。这样你就可以调用create并调用某个影片的get方法,该方法可以返回演员姓名列表。
答案 1 :(得分:0)
它建立了键(本例中的电影)和值(本例中的演员列表)之间的关系。
将其视为按电影分类(分组)的演员集合。
<强>声明:强>
Map<Movie, List<Actor>> actorsByMovies = new HashMap<>();
添加电影:
Movie newMovie = ...
actorsByMovies.put(newMovie, new ArrayList<>());
从电影中获取演员:
Movie myMovie = ...
List<Actor> actors = actorsByMovies.get(myMovie);
获取所有电影:
Set<Movie> allMovies = actorsByMovies.keySet();
检查电影:
Movie myMovie = ...
boolean doesMovieExist = actorsByMovies.containsKey(myMovie);
以下是reference。
希望这有帮助。
祝你好运。
答案 2 :(得分:0)
您的Movie
课程可以存储您想要保留的每部电影的所有信息。这可能包括电影中所有演员的列表。它还可以包括一种从扫描仪创建电影的方法:
class Movie {
private final String name;
private final Person director;
private final List<Person> actors;
private final int yearOfRelease;
public Movie makeFromScanner(Scanner movieScanner) {
Movie movie = new Movie();
movie.yearOfRelease = movieScanner.nextInt();
...
return movie.
}
public boolean hasActor(Person actor) {
return actors.contains(actor);
}
}
如果您将电影列表存储为列表:
List<Movie> movies;
然后,例如,找到所有具有特定演员的电影将是:
Set<Person> moviesWithActor = movies.stream()
.filter(movie -> movies.hasActor(myActor))
.collect(Collectors.toSet());
或者找一部电影的所有演员:
Set<Person> actorsForMovie = movies.stream()
.filter(movie -> movie.hasName(myMovie))
.collect(Collectors.toSet());
虽然像Map
之类的东西显然更有效率地快速找到电影,但除非你有数百万部电影或每秒搜索多次,否则没有必要:详尽的搜索是细