我有一个包含ArrayList <integer>的ArrayList。我无法从ArrayList <integer>

时间:2015-09-22 10:26:59

标签: java arraylist

&#34; gamePiles&#34; ArrayList存储&#34; coin&#34;的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--;
    }
}

2 个答案:

答案 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变量。