编辑:我正在重写这个问题,希望能让代码更加清晰。
我有一个类,Pred,有2个变量。
public class Pred {
private String str;
private ArrayList<Keys> keysArr;
public Pred(String s) {
this.str = s;
keysArr = new ArrayList<Keys>;
}
public void setKeysArr(ArrayList<Keys> kArr) {
this.keysArr.addAll(kArr);
}
}
在extract()方法中,我遍历另一个数组,获取一些变量,并使用它们来创建新的Preds
。
public static Collection<Pred> extractPause(Keys[] kseArr) {
Collection<Pred> predArray = new ArrayList<Pred>();
// create method variables
ArrayList<Keys> keysArray ka = new ArrayList<Keys>();
String s = "";
// loop through an array
for (int i; i < someArray.size(); i++) {
s = "Sam"+i;
ka.add(key1+i);
ka.add(key2+i);
// create new instance of Pred
Pred p = new Pred(s);
p.setKeysArr(ka);
predArray.add(p);
// reset variables (not sure if that's necessary)
s = "";
ka.clear();
}
return predArray;
}
当我去打印Preds
数组时,我遇到了一个奇怪的情况,我只得到Pred
中最后predArray
的数组值。
public void print() {
for (Pred p : predArry)
System.out.println(p.str+" "+p.get(p.keysArr.size()-1).getKeys());
}
输出:
Sam1 key12 key2
Sam2 key12 key22
应该是:
Sam1 key11 key21
Sam2 key12 key22
答案 0 :(得分:3)
可能是因为当您创建Foo
个实例列表时,您可以
Foo foo = new Foo();
for (int i = 0; i < 10; i++) {
foo.setBarStr("hello " + i);
foo.setKeyArray(...);
list.add(foo);
}
而不是
for (int i = 0; i < 10; i++) {
Foo foo = new Foo();
foo.setBarStr("hello " + i);
foo.setKeyArray(...);
list.add(foo);
}
请记住,列表包含对象的引用,而不包含对象的副本。因此,如果将10个相同的Foo实例添加到列表中,该列表将包含对此唯一实例的10个引用,这些引用当然包含其最后修改状态。
答案 1 :(得分:1)
我认为问题在于您的打印功能。我不知道get或getKeys函数是做什么的,但我认为即使存在其他具有不同键值的Pred对象,你也会从同一个对象获取键。
System.out.println(p.str+" "+p.get(p.keysArr.size()-1).getKeys());
如果你在这里有拼写错误
predArry.get(...)
在您的代码中,您不断获得相同的Pred对象,这就解释了为什么您不断获得相同的键值。因为索引p.keysArr.size() - 1不会更改其中任何一个对象。 p.keysArr.size() - 1在上面的示例中始终为1,并且您继续从Pred对象数组中获取相同的Pred对象,即PredArry