Java 如何为数组中的每个对象创建数组?
我有一个从列表中选择项目的代码,我有一个扫描器来扫描文件(每行有电影,然后是演员),并将电影添加到数组中。我该怎么做才能使它添加到arraylist中的每一部电影都能在线存储紧随其后的演员?例如: 每行有一行是电影名(日期)/LastName、FirstName/Lastname2、Firstname2/等等。我的代码包含一个类Movie,它将Movie名称转换为字符串。我怎么能在任何一点上搜索任何一部电影,并让它吸引所有主演该电影的演员Java 如何为数组中的每个对象创建数组?,java,arrays,eclipse,Java,Arrays,Eclipse,我有一个从列表中选择项目的代码,我有一个扫描器来扫描文件(每行有电影,然后是演员),并将电影添加到数组中。我该怎么做才能使它添加到arraylist中的每一部电影都能在线存储紧随其后的演员?例如: 每行有一行是电影名(日期)/LastName、FirstName/Lastname2、Firstname2/等等。我的代码包含一个类Movie,它将Movie名称转换为字符串。我怎么能在任何一点上搜索任何一部电影,并让它吸引所有主演该电影的演员 public void loadDataFromFil
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();
}
public void loadDataFromFile(字符串文件名){
/**
*此方法接受一个参数,即文件名,并从该文件打印数据
*/
扫描仪3=空;
myMovies=newArrayList();
试试{
扫描仪3=新扫描仪(新文件输入流(文件名));}
捕获(例外情况除外){
System.err.println(“IndexOutOfBoundsException:+ex.getMessage());
}
while(扫描程序3.hasNextLine()){
int i=1;
i=i+1;
Movie foo=新电影(扫描程序3.nextLine());
添加(foo);
}
扫描仪3.关闭();
}
我需要能够搜索一部电影的名字,并让它返回给我的每一个演员在同一行的电影。但是,我不知道怎么做。最好的方法是使用地图。
它在键(本例中为电影)和值(本例中为演员列表)之间建立关系
将其视为按电影分类(分组)的演员集合 声明:
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);
这里是进一步的 希望这有帮助。
祝你好运。不要将myMovies设置为ArrayList,而是将其设置为Map。 但在此之前,您需要创建一个单独的ArrayList,其中包含该电影的演员。 因此,它将是:
ArrayList<String> actors = new ArrayList<String>();
ArrayList actors=new ArrayList();
然后:
Map myMovies=newhashmap();
您希望在阅读所有行之前创建myMovies,如果您希望随时访问它,甚至可以将其设置为全局变量。
为了获得该特定电影的所有演员,您将执行以下操作:
ArrayList<String> movieActors = myMovies.get([movie_object]);
String firstActor = movieActors.get(0);
ArrayList 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);
...
Map myMovies=newhashmap();
...
while(扫描程序3.hasNextLine()){
int i=1;
i+=1
ArrayList actors=新的ArrayList();
//
//使用分隔符分隔电影和演员的名字
//例如,假设字符串位于一个名为“split”的数组中
//其中,拆分[0]是电影标题
//接下来的就是演员的名字
//
字符串movieName=split[0]
对于(int j=1;j
实现这一点的另一种方法是将演员的名字放在电影对象中。这样,您就可以调用特定电影的create和get方法,该方法可以返回演员的名字列表。您的
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);
}
}
类电影{
私有最终字符串名;
私人最终董事;
私人最终演员名单;
私人最终租赁年;
公共电影制作从扫描仪(扫描仪电影扫描仪){
电影=新电影();
movie.yearOfRelease=movieScanner.nextInt();
...
返回电影。
}
公共布尔hasActor(Person-actor){
返回actors.contains(actor);
}
}
如果将电影列表存储为列表:
List<Movie> movies;
列出电影;
然后发现,例如,所有有特定演员的电影都是:
Set<Person> moviesWithActor = movies.stream()
.filter(movie -> movies.hasActor(myActor))
.collect(Collectors.toSet());
Set moviesWithActor=movies.stream()
.filter(电影->电影.hasActor(我的演员))
.collect(收集器.toSet());
或者为一部电影寻找所有演员:
Set<Person> actorsForMovie = movies.stream()
.filter(movie -> movie.hasName(myMovie))
.collect(Collectors.toSet());
Set actorsForMovie=movies.stream()
.filter(电影->电影.hasName(我的电影))
.collect(收集器.toSet());
虽然使用
地图之类的工具快速查找电影名称显然更有效,但除非你有数百万部电影或每秒搜索多次,否则没有必要进行彻底搜索。你能详细说明一下吗?比如我将把它们放在何处?我是否必须从它们的形式修改它们我会把它们放在电影类或主代码中吗?没有一个在电影类中。它们只会在你的主代码中。特别是声明和添加的电影将在 Load DATAOFFrase方法中返回地图。如果需要的话,其他的都是有用的。按电影分类(分组)。我把你在那里的声明放在文件的加载数据中,但我仍然不知道如何从特定电影中获取演员。我不知道应该用什么替换…来获取下面的代码以返回所有演员。例如,movie myMovie=actorsByMovies.keySet().toArray()[3];
Set<Person> actorsForMovie = movies.stream()
.filter(movie -> movie.hasName(myMovie))
.collect(Collectors.toSet());