如何使索引小于大小

时间:2015-01-15 23:42:25

标签: java arraylist indexing size

我无法让索引小于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)

谢谢,如果你能提供帮助。

5 个答案:

答案 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项并将其删除即可。