我有一个ArrayList(称为filmes),其中一个元素是另一个ArrayList(称为actores),这个actores由与电影中的电影具有相同电影ID的actor名称组成。 但是每当它将一个actor添加到actores ArrayList时,它就会覆盖前一个。 因此,当同一部电影中有多个演员时,它只显示文件中的最后一个。
例如,预期输出应为6978 |小中国的大麻烦| 30-05-1986 [Kurt Russel,Kim Cattrall] [喜剧]反而它的打印6978 |小中国的大麻烦| 30-05-1986 [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;
}
}
Filme Class:
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 |黑客| 14-09-1995 null [动作]但预期是603 |矩阵| 30-03-1999 [Keanu Reeves,Carrie-Anne Moss] [科幻小说],10428 |黑客| 14-09-1995 [Angelina Jolie] [行动]。如果我能这样做,我会很高兴,而不使用地图。
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++;
}
答案 0 :(得分:3)
你在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的每个元素,并将它们放在一个Map上,该Map将filmId作为Key,并将该影片的Actors列表作为值。如果您需要帮助,请告诉我。