我有一个ArrayList(称为filmes),其中一个元素是另一个ArrayList(称为actores),此actore由与电影中的电影具有相同电影ID的演员名称组成。
但是每次将actor添加到actores ArrayList时,它都会覆盖那里的前一个actor。
因此,当同一部电影有多个演员时,它只会显示文件中的最后一个。
例如,预期输出应为6978 |小中国的大麻烦1986年5月30日[库尔特·罗素(Kurt Russel),金·卡特尔(Kim Cattrall)] [喜剧],但它却在印刷6978 |小中国的大麻烦1986年5月30日[Kim Cattrall] [喜剧]
/*Actorsfile.txt (the last element is the movie id)
11701,Angelina Jolie,false,1995
6384,Keanu Reeves,true,603
7382,Carrie-Anne Moss,false,603
11701,Angelina Jolie,false,10428
6856,Kurt Russell,true,6978
2109,Kim Cattrall,false,6978*/
try{
File ficheiroA = new File(Actorsfile);
Scanner leitorFicheiroA = new Scanner(ficheiroA);
while (leitorFicheiroA.hasNextLine()) {
ArrayList<Actor> actores = new ArrayList<>();
Actor actor = new Actor("");
String linha = leitorFicheiroA.nextLine();
String dadosA[] = linha.split(",");
if (dadosA.length == 4) {
int idFilmeA = Integer.parseInt(dadosA[3]);
int pos = index(idFilmeA, ids);
if (idFilmeA == ids[pos]) {
actor.nome = (dadosA[1]);
actores.add(actor);
filmes.get(pos).mudarActores(actores);
}
}
}
}
catch(FileNotFoundException e) {
String mensagem = "Erro: o ficheiro " + ficheiroActores + " nao foi encontrado.";
System.out.println(mensagem);
}
演员班:
public class Actor {
String nome;
String genero;
public Actor(String nome) {
this.nome = nome;
}
public String toString () {
return nome;
}
}
电影课:
public class Filme {
int id;
String titulo;
ArrayList<Actor> actores= new ArrayList<>();
ArrayList<GeneroCinematografico> generos= new ArrayList<>();
String dia,mes,ano;
public Filme(int id, String titulo,ArrayList<Actor> actores, ArrayList<GeneroCinematografico> generos,String ano,String mes,String dia) {
this.id = id;
this.titulo = titulo;
this.actores = actores;
this.generos = generos;
this.ano=ano;
this.mes=mes;
this.dia=dia;
}
public void mudarId(int id) {
this.id = id;
}
public void mudarTitulo(String titulo) {
this.titulo = titulo;
}
public void mudarActores(ArrayList<Actor> actores) {
this.actores =actores;
}
public void mudarGeneros(ArrayList<GeneroCinematografico> generos) {
this.generos = generos;
}
public String toString() {
return id + " | " + titulo + " | " + dia + "-" + mes + "-" + ano +" "+ actores +" "+ generos;
}
}
编辑:
我以不同的方式完成了它,现在在第一部电影中运行良好,但是下一部为空。
最近输出为603 |矩阵| 30-03-1999 [Keanu Reeves,Carrie-Anne Moss] [科幻小说],10428 |黑客| 1995年9月14日null [Action]但预期为603 |矩阵| 30-03-1999 [Keanu Reeves,Carrie-Anne Moss] [科幻小说],10428 |黑客| 1995年9月14日[安吉丽娜·朱莉] [行动]。如果能以这种方式做到这一点,而无需使用地图,我将非常感激。
try{
File ficheiroA = new File(ficheiroActores);
Scanner leitorFicheiroA = new Scanner(ficheiroA);
i=0;
while (i<ids.length-1) {
int idFilme=ids[i];
ArrayList<Actor> actores = new ArrayList<>();
while (leitorFicheiroA.hasNextLine()) {
Actor actor;
String linha = leitorFicheiroA.nextLine();
String dadosA[] = linha.split(",");
int idFilmeA = Integer.parseInt(dadosA[3]);
//int pos = index(idFilmeA, ids);
if (dadosA.length == 4) {
if (idFilmeA == idFilme) {
actor =new Actor (dadosA[1]);
actores.add(actor);
}
}
filmes.get(i).mudarActores(actores);
}
i++;
}
最佳答案
您在while内声明了一个新的ArrayList,因此它将重置每次迭代。您想要做的是将while之外的ArrayList的创建。代替:
while (leitorFicheiroA.hasNextLine()) {
ArrayList<Actor> actores = new ArrayList<>();
你要:
ArrayList<Actor> actores = new ArrayList<>();
while (leitorFicheiroA.hasNextLine()) {
然后,当一会儿结束时,您调用
filmes.get(pos).mudarActores(actores);
。编辑:
为了解决您正在评论的问题,我将从当前位置删除
filmes.get(pos).mudarActores(actores);
。请注意,您拥有每个Actor中所需的所有信息。因此,我将保留当前的逻辑,而现在,可以将其放在函数readActoresFromFile()中,返回Actores列表。然后,我将遍历List的每个元素,并将它们放到一个以filmId作为Key并将该电影的Actor列表作为值的Map上。告诉我您是否需要帮助。