Java ArrayList值设置为退出for循环后的最后一个值

Java ArrayList值设置为退出for循环后的最后一个值,java,arraylist,Java,Arraylist,我有一个方法,可以从一个数据集中创建一个Name对象列表,该数据集包含一个名称和11个整数,表示该名称在过去几十年中的流行程度 数据示例: Zelda 436 420 468 526 789 961 938 0 0 0 0 Zulma 0 0 0 0 0 0 837 0 0 0 0 当前数据集被正确读取,当我从for循环中检查Name对象时,一切都是正确的 但是在退出for循环后,ArrayList中的所有值与上一个条目具有相同的流行值,而name值保持正确 应该发生什么: Zelda 436

我有一个方法,可以从一个数据集中创建一个
Name
对象列表,该数据集包含一个名称和11个整数,表示该名称在过去几十年中的流行程度

数据示例:

Zelda 436 420 468 526 789 961 938 0 0 0 0
Zulma 0 0 0 0 0 0 837 0 0 0 0
当前数据集被正确读取,当我从for循环中检查
Name
对象时,一切都是正确的

但是在退出
for
循环后,
ArrayList
中的所有值与上一个条目具有相同的流行值,而
name
值保持正确

应该发生什么:

Zelda 436 420 468 526 789 961 938 0 0 0 0
Zelda [436, 420, 468, 526, 789, 961, 938, 0, 0, 0, 0]
实际发生的情况:

Zelda 436 420 468 526 789 961 938 0 0 0 0
Zelda [0, 0, 0, 0, 0, 0, 837, 0, 0, 0, 0]
最后一项的数据和输出:

Zulma 0 0 0 0 0 0 837 0 0 0 0
Zulma [0, 0, 0, 0, 0, 0, 837, 0, 0, 0, 0]
代码:

publicstaticarraylistcreatenamearray(字符串[]数据){
整数名长度;
字符串名;
弦弹;
ArrayList name=新的ArrayList();
int[]popsInts=新int[11];
对于(int i=0;i
我如何从主方法调用:

ArrayList<Name> list = createNameArray(data);
// Printing out ArrayList, all values are wrong except last one
// Using a regular for loop produces same results
for(Name n : list) { 
    System.out.println(n);
}
ArrayList list=createNameArray(数据);
//打印ArrayList时,除最后一个值外,所有值都错误
//使用正则for循环会产生相同的结果
对于(名称n:列表){
系统输出println(n);
}
我尝试过使用
名称[]
,但同样的情况也发生了


我做错了什么?我能做些什么来修复错误?

问题是您的
名称
类可能定义为

class Name {
  String name;  
  int[] popsInt;

  Name(String name, int[] popsInt) {
    this.name = name;
    this.popsInt = popsInt)
  }
}
因此,您正在
Name
实例中存储对
int[]
的引用。但传递给构造函数的数组只是一个数组,它是在解析所有数据的循环之外构造的:

int popsInt = new int[11];
for (each game) {
  popsInt = parse data
  list.add(new Name(name, popsInt));
}
因此,通过将引用始终传递给同一数组来构造
名称
,因此最终它们都指向同一组11个值

您必须在每次调用时复制传递的数据或分配新数组,例如:

for (each game) {
  int[] popsInt = new int[11];
  popsInt = parse data;
  list.add(new Name(name, popsInt));
}

现在每个
Name
实例都有了自己的数组。

Create
int[]popsInts=newint[11]在循环中。实际上,您有一个数组,可以多次添加到
列表中
Name
的实现是什么?@ElliottFrisch有效,但我不明白它为什么有效。每个循环都会将popInts更改为新值,并且在将每个name对象添加到ArrayList后,我会打印它,ArrayList会打印正确的值。在循环外部创建int数组如何影响循环退出后发生的事情,即使它在循环内部工作正常?谢谢你的快速回复:)编辑:杰克在他们的回答中解释了它。是的,否则,构造函数可以复制数组。@MauricePerry:事实上,我在我的回答中指定了它“你必须复制传递的数据…”好的,对不起。也就是说,我认为构造器应该总是复制它想要保留的任何东西。谢谢!我原以为当你做了这样的事情时它复制了数组,但我现在明白这不是发生的事情。
for (each game) {
  int[] popsInt = new int[11];
  popsInt = parse data;
  list.add(new Name(name, popsInt));
}