ArrayList:remove方法抛出java.lang.IndexOutOfBoundException

时间:2015-03-03 16:36:53

标签: java methods arraylist

我目前正在AP CS elevens实验室工作,你可以开发自己的卡片和甲板课程来模拟纸牌游戏。我正在编写一个shuffle方法,该方法接受一个Deck对象并随机地随机移动其中的Card个对象。到目前为止,这是我的方法:

public void shuffle() {
 ArrayList<Card>copy = new ArrayList <Card> ();
 for (int i = cards.size(); i >= 0; i--) {
   int d = (int)(Math.random()*i);
   copy.add(cards.get(d));
   cards.remove(d);
 }
size = cards.size();
cards = copy;
}

cards是一个已使用多个Card对象初始化的ArrayList。此代码可以正常工作,但前提是cards.remove(d);行不存在。为什么是这样?我该如何解决?

如果这有帮助,这里给出了Deck的构造函数类:

public Deck(String[] ranks, String[] suits, int[] values) {
    cards = new ArrayList<Card>();
    for (int j = 0; j < ranks.length; j++) {
        for (String suitString : suits) {
            cards.add(new Card(ranks[j], suitString, values[j]));
        }
    }
    size = cards.size();
    shuffle();
}

2 个答案:

答案 0 :(得分:0)

查看您的代码

for (int i = cards.size(); i >= 0; i--) {

当大小为0(没有卡片时),这将进入循环,因此java.lang.IndexOutOfBoundsException

将循环条件中的>= 0更改为> 0

for (int i = cards.size(); i > 0; i--) {

请注意,Collections已采用shuffle方法,以List为参数。

答案 1 :(得分:0)

如果没有任何卡片(即cards.size() == 0时),您会尝试移除卡片。通过将循环终止条件更改为i > 0来修复它。

或者,我可能会以不同的方式编写循环:

while (!cards.isEmpty()) {
    int d = (int) (Math.random() * cards.size());
    copy.add(cards.remove(d));
}

对我来说这似乎更清楚了。