"gamePiles"数组列表存储"硬币"数组列表。我正在编写一个方法来删除给定数量的硬币为gamePiles数组列表的选定索引。然而,下面的方法会导致从所有gamePile元素中移除硬币。
public class game(){
private ArrayList<Integer> Coins = new ArrayList<Integer>();
private ArrayList<ArrayList<Integer>> gamePiles = new ArrayList<ArrayList<Integer>>();
我用下面的makePiles()方法初始化
public void makePiles(){
for(int i=0; i<arbitrary; i++){
Coins.add(i);
}
System.out.println("initial amount of coins " + Coins.size());
for(int z = 0; z < arbitraryPiles; z++){
gamePiles.add(Coins);
}
System.out.println("this many piles " + gamePiles.size());
}
displayPiles()方法在屏幕上显示堆和硬币
public void displayPiles(){
for(int i=0; i < gamePiles.size(); i++){
int z = i+1;
System.out.print("Pile " + z + ": ");
for(int y =0; y < gamePiles.get(i).size(); y++){
//System.out.print(y + 1);
System.out.print(" "+gamePiles.get(i).get(y));
}
System.out.println();
}
}
下面是调用
方法的那行game.removeCoinsFromPile(int pile, int coins)
下面的for循环并不是简单地从所选堆中删除"最后"元素。它从gamePiles数组列表中移除所有堆的最后一个元素。我希望它只从选定的那堆硬币中取出硬币。
public void removeCoinsFromPile(int pile, int coins) {
int last = gamePiles.get(pile).size() - 1;
for(int i = coins; i > 0; i--) {
gamePiles.get(pile).remove(last);
last--;
}
}
gamePiles
中的所有元素都引用相同的列表。当你改变其中一个时,它们都将改变,因为它们引用的是完全相同的列表。
尝试替换这个:
for(int z = 0; z < arbitraryPiles; z++){
gamePiles.add(Coins);
}
与这个:for(int z = 0; z < arbitraryPiles; z++){
gamePiles.add(new ArrayList<>(Coins));
}
这将为gamePiles
中的每个元素创建一个新的Coins
列表副本。
你将同一堆硬币添加到一堆硬币的列表中。您应该为每个列表创建一个新堆,如下所示:
for(int z = 0; z < arbitraryPiles; z++){
for(int i=0; i<arbitrary; i++){
coins.add(i);
}
System.out.println("initial amount of coins " + coins.size());
gamePiles.add(coins);
}
System.out.println("this many piles " + gamePiles.size());
当然,arbitrary
变量应该为内部循环的每次迭代设置,如果你不想生成相同大小的列表。