gpt4 book ai didi

java - ArrayList 覆盖

转载 作者:行者123 更新时间:2023-12-01 19:53:04 24 4
gpt4 key购买 nike

我有一个ArrayList(称为filmes),其中一个元素是另一个ArrayList(称为actores),这个actores由与filmes中的电影具有相同电影id的 Actor 的名字组成。但每次它向 actores ArrayList 添加一个 actor 时,它都会覆盖前一个 actor。因此,当同一部电影有多个 Actor 时,它只会显示文件中的最后一位 Actor 。

例如,预期输出应为 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);
}

Actor 类别:

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 |矩阵| 1999 年 3 月 30 日 [基努·里维斯、凯莉·安·莫斯] [科幻小说], 10428 |黑客 | 14-09-1995 null [操作] 但预期为 603 |矩阵| 1999 年 3 月 30 日 [基努·里维斯、凯莉·安·莫斯] [科幻小说], 10428 |黑客 | 1995 年 9 月 14 日 [安吉丽娜朱莉] [行动]。如果我能以这种方式做到这一点,而不使用 map ,我将非常感激。

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()) {

然后当 while 结束时调用 filmes.get(pos).mudarActores(actores);

编辑:

为了解决您评论的问题,我将从现在的位置删除 filmes.get(pos).mudarActores(actores); 。请注意,您拥有每个 Actor 所需的所有信息。因此,我将保留当前 while 的逻辑,也许将其放入函数 readActoresFromFile() 中,返回 Actor 列表。然后,我将迭代列表中的每个元素,并将它们放在以 filmId 作为键、以该电影的 Actor 列表作为值的 Map 上。如果您需要帮助,请告诉我。

关于java - ArrayList 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50627599/

24 4 0