我有一个包含 ArrayList 的 ArrayList<Integer>。我从数组列表中<Integer>删除元素时遇到问题



"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变量应该为内部循环的每次迭代设置,如果你不想生成相同大小的列表。

相关内容

最新更新