2011-12-15 104 views
-1

我怀疑返回的值是我添加到我的数组列表中的最后一个。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条件和额外的循环,但我把他们从这个例子的,因为他们是那种凌乱和最有可能不相关。

对象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. 
} 
+1

你可以写一个自包含的程序来重现问题吗?编写一个简单的程序,显示问题并保持简化,直到不能显示问题。 – 2011-12-15 15:53:12

+0

你在示例代码中调用`genM`,但你已经显示`genMenMoves` - 它们的意思是相同的方法吗? (我真的希望你的名字在你的实际代码中更清楚) – 2011-12-15 15:53:27

回答

1

这是相当困难的理解发生了什么代码,因为该片段都是非编译和名称,而神秘,但我有一个去...

return声明您在下面的for循环有看起来十分可疑:

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

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

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

0

您已删除了一些相关的代码和名称类型不匹配真的,但我认为你有一些问题,你叫为P或G.

可能的对象:

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

基本上,你正在改变G的一些值并将它添加到列表中几次。最后,所有对象都与您在使用相同的G对象时相同。

相关问题