我无法让索引小于arrayList的大小,以便我可以处理这些卡。这是我的代码:
import java.util.Collection;
import java.util.Collections;
import java.util.Random;
import java.util.ArrayList;
public class Deck {
ArrayList<Card> unusedCards = new ArrayList<Card>();
ArrayList<Card> usedCards = new ArrayList<Card>();
Card newCard = new Card();
Random rand = new Random();
//Creates a Deck of 52 randomly ordered card objects (No repeats)
public Deck() {
for (int i = 0; i <= 52; i++) {
while (unusedCards.contains(newCard)) {
newCard = new Card();
}
unusedCards.add(newCard);
}
}
//shuffles the arraylist of the deck of cards, making it so the cards are dealt in a different order
public void shuffle(){
Collections.shuffle(unusedCards);
}
//Boolean is true when the Unsed deck has no cards left
public boolean isEmpty(){
if (unusedCards.size() == 0) return true;
else return false;
}
//returns an arraylist containing the specified number of cards
public ArrayList<Card> Deal(int numToDeal){
ArrayList<Card> DealCards = new ArrayList<Card>();
for (int i = 0; i < numToDeal; i++){
int index = rand.nextInt(50);
DealCards.add(unusedCards.get(index));
usedCards.add(unusedCards.get(index));
unusedCards.remove(unusedCards.get(index));
}
return DealCards;
}
}
当我尝试处理多张卡片时,我一直收到此错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 48, Size: 48
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at nnajiO.Deck.Deal(Deck.java:41)
at nnajiO.CrazyEights.main(CrazyEights.java:26)
谢谢,如果你能提供帮助。
答案 0 :(得分:0)
尝试
int index = rand.nextInt(unusedCards.size());
通过这种方式,您将生成一个随机数,该数字始终位于未使用卡片大小的范围内
答案 1 :(得分:0)
你在牌组中放了53张牌。
for (int i = 0; i <= 52; i++) {
数组中的索引范围是0 .. length-1
。因此,您希望在上述语句中使用<
运算符而不是<=
运算符。
另一个问题是类似的。您在使用静态随机范围时从unusedCards
删除卡片:
int index = rand.nextInt(50);
在这种情况下,应将其更改为以下内容,以避免选择超出范围的索引:
int index = rand.nextInt(unusedCards.size());
答案 2 :(得分:0)
在此行中,您要从列表中删除元素:
unusedCards.remove(unusedCards.get(index));
但是,在同一个for循环中,您正在从同一列表中检索元素,最终,代码尝试访问在循环的上一次迭代中删除的索引处的元素。
答案 3 :(得分:0)
当你发牌时,无论unusedCards
中剩余的牌数是多少,你总是从0-49拉出一张随机牌:
public ArrayList<Card> Deal(int numToDeal){
ArrayList<Card> DealCards = new ArrayList<Card>();
for (int i = 0; i < numToDeal; i++){
int index = rand.nextInt(50); // this should check the number of cards left
DealCards.add(unusedCards.get(index));
usedCards.add(unusedCards.get(index));
unusedCards.remove(unusedCards.get(index));
}
return DealCards;
}
您尝试处理的卡越多,您就越有可能尝试处理未使用套牌的“结束”。
根据剩余卡片的数量而不是50
让你的圈子选择一张随机卡片:
for (int i = 0; i < numToDeal; i++){
int index = rand.nextInt(unusedCards.size());
...
答案 4 :(得分:0)
查看代码的这一部分:
for (int i = 0; i < numToDeal; i++){
int index = rand.nextInt(50);
DealCards.add(unusedCards.get(index));
usedCards.add(unusedCards.get(index));
unusedCards.remove(unusedCards.get(index));
}
您正在创建0到49范围内的随机索引。首先,您的数组中有53个元素,因此这将起作用。但是你最后会看到remove
吗?这意味着从列表中删除了一张卡片,所以它现在有52个元素。
下次你这样做时,51仍然存在,依此类推。最终你剩下的元素少于49个。此时,数字49
不是有效索引。因此,如果随机数生成器恰好生成它,那么您将得到错误。
相反,您应该将index
限制为unusedCards.size()
。
顺便说一句,如果你洗牌,实际上没有必要随机查看unusedCards
列表。它已经是随机顺序了。只需处理最后的numToDeal
项并将其删除即可。