" gamePiles" ArrayList存储" coin"的ArrayList。我正在编写一种方法来为gamePiles ArrayList的选定索引删除给定数量的硬币。但是,以下方法会导致从所有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循环并不是简单地删除&#34; last&#34;选定桩的元素。 它从gamePiles ArrayList中删除所有桩中的最后一个元素。我希望它只从所选择的堆中移除硬币。
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--;
}
}
答案 0 :(得分:2)
gamePiles
中的所有元素都指的是同一个列表。当你改变其中一个时,它们都会改变,因为它们指的是完全相同的列表。
尝试替换它:
for(int z = 0; z < arbitraryPiles; z++){
gamePiles.add(Coins);
}
用这个:
for(int z = 0; z < arbitraryPiles; z++){
gamePiles.add(new ArrayList<>(Coins));
}
这将为Coins
中的每个元素创建gamePiles
列表的新副本。
答案 1 :(得分:0)
您在一堆桩中添加相同的一堆硬币。你应该为每个列表创建一个新的堆栈,如下所示:
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
变量。