【问题标题】:ArrayList add method is overwriting Objects in the listArrayList add 方法正在覆盖列表中的对象
【发布时间】:2016-01-19 20:02:44
【问题描述】:

所以,当我尝试向 ArrayList 添加 Trick 时,添加的 Trick 会覆盖 ArrayList 中已有的内容,因此 ArrayList 中的所有元素都包含我刚刚添加的 Trick。

这些方法在我的主类中:

public Trick playTrick(Player firstPlayer){
     Trick t=new Trick(firstPlayer.getID());
        return t;

}


public void playGame(){

    for(int i=0;i<NOS_TRICKS;i++){

        Trick t=playTrick(players[firstPlayer]);
        players[firstPlayer].update(t);
        //System.out.println(t.completedTricks);
    }

}

当调用 player[firstPlayer].update(t) 时发生错误,update(t) 将 Trick t 添加到我的 ArrayList:

public class BPlayer implents Player{
   public void update(Trick t){
       this.strategy.updateData(t);
   }
}

然后触发 updateData:

public class AdvStrategy implements Strategy{
    public static ArrayList<Trick> completedTricks = new ArrayList<>();

    @Override
    public void updateData(Trick c) {
        completedTricks.add(c);
    }
}

打印 ArrayList 时的输出示例:

Trick ={3=KING DIAMONDS, 0=TWO DIAMONDS, 1=THREE DIAMONDS, 2=FIVE DIAMONDS}
Lead =3 Winner =3 DIAMONDS
ARRAYLIST[{3=KING DIAMONDS, 0=TWO DIAMONDS, 1=THREE DIAMONDS, 2=FIVE DIAMONDS}]
Trick ={3=QUEEN DIAMONDS, 0=FOUR DIAMONDS, 1=SIX DIAMONDS, 2=TEN DIAMONDS}
Lead =3 Winner =3 DIAMONDS
ARRAYLIST[{3=QUEEN DIAMONDS, 0=FOUR DIAMONDS, 1=SIX DIAMONDS, 2=TEN DIAMONDS}, {3=QUEEN DIAMONDS, 0=FOUR DIAMONDS, 1=SIX DIAMONDS, 2=TEN DIAMONDS}]

工作时最后一行输出应该是这个...

ARRAYLIST[{3=KING DIAMONDS, 0=TWO DIAMONDS, 1=THREE DIAMONDS, 2=FIVE DIAMONDS}, {3=QUEEN DIAMONDS, 0=FOUR DIAMONDS, 1=SIX DIAMONDS, 2=TEN DIAMONDS}]

【问题讨论】:

  • 您遇到的错误是什么?
  • 问题表明您正在重用现有技巧来设置卡片,而不是创建新技巧。但是,在提供的信息中看不到负责该问题的代码,因为您似乎认为 ArrayList 有问题,而不是您自己的代码。

标签: java arrays arraylist collections


【解决方案1】:

当你写Trick t 这是一个Trick 的reference 并且当你把这个reference 添加到一个ArrayList 时,复制的是引用而不是它引用的对象。这意味着,如果您多次向 List 添加相同的引用并更改它引用的对象,那么在实际上只有一个对象之前似乎所有对象都已更改。

在您的代码中,您不止一次地添加了相同的引用。我建议您在调试器中单步执行您的代码,以查看发生这种情况的确切位置。

或者,您可以检查您要添加的 Trick 是否已经在列表中,如果是则抛出错误。

【讨论】:

  • 这肯定不是 6 年来第一次有人提出归结为该问题的问题。典型的骗子在哪里?
  • @BalusC 确实,尽管从提供的代码中不清楚究竟是什么问题,这就是为什么需要使用他们的调试器进行更多调查的原因。如果我将问题标记为“您是否尝试过调试?”我会经常使用它。
猜你喜欢
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 2010-10-09
相关资源
最近更新 更多