ArrayList :删除方法 throw java.lang.IndexOutOfBoundException
ArrayList : remove method throw java.lang.IndexOutOfBoundException
我目前在 AP CS 十一人实验室工作,您可以开发自己的纸牌和套牌 classes 以模拟纸牌游戏。我目前正在编写一个随机播放方法,它接受一个 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
的构造函数 class,给您:
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();
}
看看你的代码
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
作为参数。
你试图在没有剩余卡片时移除卡片(即当 cards.size() == 0
时)。通过将循环终止条件更改为 i > 0
.
来修复它
或者,我可能会以不同的方式编写循环:
while (!cards.isEmpty()) {
int d = (int) (Math.random() * cards.size());
copy.add(cards.remove(d));
}
这对我来说似乎更清楚了。
我目前在 AP CS 十一人实验室工作,您可以开发自己的纸牌和套牌 classes 以模拟纸牌游戏。我目前正在编写一个随机播放方法,它接受一个 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
的构造函数 class,给您:
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();
}
看看你的代码
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
作为参数。
你试图在没有剩余卡片时移除卡片(即当 cards.size() == 0
时)。通过将循环终止条件更改为 i > 0
.
或者,我可能会以不同的方式编写循环:
while (!cards.isEmpty()) {
int d = (int) (Math.random() * cards.size());
copy.add(cards.remove(d));
}
这对我来说似乎更清楚了。