ArrayList为每个索引返回相同的元素

时间:2011-12-15 15:50:58

标签: java

我怀疑返回的值是我添加到arraylist的最后一个。

我有一个类Game,其中执行以下函数...

    public List<M> compute() throws CloneNotSupportedException{
    G chil = (G) this.clone();
    List<Move> Pm = new ArrayList<M>();
            Point p;

       for(/*condition*/){
                //p is defined up here.basically loops through all possible values of p.
            M m = pud.genM(chil, p);
            Pm.add(m);
        }
       return Pmoves;
}

奇怪的是我正在对m返回的值进行打印,它们与预期(不同)一样,但是当我遍历已创建的List时,每个元素都等于添加的最后一个元素。看来,这最后一个被添加的元素覆盖了所有以前的孩子......

变量pud的类型为User。被调用的函数是......

public M genM(GameState g, boardPoint p){
    M m; // a move
    for(/*condition*/){
        m = new M(/*parameters*/);
        return m;
    }
    return null;
}

我已经简化了这个类,有一些if else条件和一个额外的for循环但是我把它们从这个例子中拿出来因为它们有点混乱而且很可能无关紧要。

对象M定义为......

    public M(String type, Point fPos, Point tPos, String input, G g){
    this.type = type;
    this.toPos = toPos;
    this.fromPos = fromPos;
    this.uInput = uInput;
    result = new G(g);
            //value of G gets edited here.
}

2 个答案:

答案 0 :(得分:1)

很难理解代码中发生了什么,因为这些代码片段是不可编辑的,而且这些名称相当含糊,但我还是会去...

您在return循环中的for语句看起来非常可疑:

public M genM(GameState g, boardPoint p){
    M m; // a move
    for(/*condition*/){
        m = new M(/*parameters*/);
        return m;
    }
    return null;
}

如果它实际上是return循环中的无条件for,那么循环将最多运行一次迭代。

这可能是一个红色的鲱鱼,但同样,根据您向我们展示的代码很难确定。

答案 1 :(得分:0)

你删除了一些相关的代码和名称类型并不真正匹配,但我认为你对你称之为P或G的对象有一些问题。

可能:

您正在克隆G对象一次,然后在for循环中对同一G对象进行操作,从而影响列表中的所有值。

基本上,您正在更改G的某些值并将其多次添加到列表中。最后,所有对象与处理同一G对象时的对象相同。