繁体   English   中英

Java数组:关于大小的意外行为?

[英]Java Arrays: Unexpected behavior regarding size?

看一下以下用于构造卡片组的代码。 我正在使用xFactor“变量”(硬编码)从数组大小中减去1,以调整为零索引。 我注意到在遇到“ java.lang.ArrayIndexOutOfBoundsException:12”错误之前,实际上我总共可以减去40。

如果我输入39作为xFactor,它运行得很好。 它构造了整个卡组,全部52张卡,尽管奇怪的是,cards.length将等于deckTotal-每个循环的两侧的xFactor?!? 这没有任何意义,因为它需要达到51的索引才能构造整个甲板,而它确实可以...

public void constructDeck(){
    int deckTotal = SUITS.length * CARDS_PER_SUIT;
    System.out.println(deckTotal); // 52
    Card[] cards = new Card[deckTotal - xFactor]; 
    System.out.println(cards.length); // Prints deckTotal - xFactor
    for(String cardSuit : SUITS){
        int cardNum = 1;
        while(cardNum <= CARDS_PER_SUIT){
            String cardDesc = cardDescription(cardNum);
            int cardValue = cardNum;
            if(cardNum >= VALUE_CEILING){
                cardValue = VALUE_CEILING;
            }
            cards[cardNum -1] = new Card(cardDesc,cardSuit,cardValue);

            this.deck.addCard(cards[cardNum -1]);
            //System.out.println(cardDesc + " of " + cardSuit + " added to the deck");
            cardNum++;
        }
    }
    System.out.println(cards.length);  // prints: deckTotal - xFactor
}

我唯一能想到的是正在从阵列的开头剪裁内存,以使后面有新的存储卡。 因此,这意味着ArrayIndexOutOfBoundsException实际上只是我的计算机处理循环和/或收集垃圾的速度的函数。

我只是编写此代码来测试Java类简介的真正基本任务。 从JS背景来看,在使用数组之前先声明数组的大小似乎有点奇怪(尽管我知道为什么)。 但是,这里的行为确实是出乎意料的,我很好奇幕后发生的事情。

更新:谢谢您的建议。 根据您的建议,这是我的最终代码。

public void constructDeck(){
    for(String cardSuit : SUITS){
        int cardNum = 1;
        while(cardNum <= CARDS_PER_SUIT){
            String cardDesc = cardDescription(cardNum);
            int cardValue = cardNum;
            if(cardNum >= VALUE_CEILING){
                cardValue = VALUE_CEILING;
            }
            this.deck.addCard(new Card(cardDesc,cardSuit,cardValue));
            cardNum++;
        }
    }
}

您使用.. cards[cardNum -1]访问cards数组,这意味着您仅使用数组中的前12个元素。 (不同的西装写在以前的西装上)

结果,只要xFactor允许至少存在12张卡,代码就可以工作..(可能不是您所期望的:))

查看代码,您真的不需要数组

       this.deck.addCard( new Card(cardDesc,cardSuit,cardValue) );

您只在[0, CARDS_PER_SUIT -1]范围内填充纸牌阵列。请看此行:

cards[cardNum -1] = new Card(cardDesc,cardSuit,cardValue);

每套西装的cardNum变量都重置为1,因此您只需覆盖相同的范围即可。

我认为您误解了数组的分配方式。 您应该分配大小。 只有索引应该停止。 一个用于52张卡的阵列应分配一个大小为52的索引范围(含[0,51]),即52个插槽。

我认为这更接近您想要的:

public void constructDeck(){
    int deckTotal = SUITS.length * CARDS_PER_SUIT;
    System.out.println(deckTotal); // 52
    Card[] cards = new Card[deckTotal]; //Allocate all the cards. 
    System.out.println(cards.length); // Prints deckTotal
    int suitOffset=0;
    for(String cardSuit : SUITS){
        int cardNum = 1;
        while(cardNum <= CARDS_PER_SUIT){
            String cardDesc = cardDescription(cardNum);
            int cardValue = cardNum;
            if(cardNum >= VALUE_CEILING){
                cardValue = VALUE_CEILING;
            }
            cards[suitOffset*CARDS_PER_SUIT+cardNum -1] = new Card(cardDesc,cardSuit,cardValue);

            this.deck.addCard(cards[cardNum -1]);
            //System.out.println(cardDesc + " of " + cardSuit + " added to the deck");
            cardNum++;
        }
        ++suitOffset;
    }
    System.out.println(cards.length);  // prints: deckTotal 
    //Now lets dump the cards to output and show we're dealing with a full deck!
    //I'm assuming Card.toString() has been overridden to return something useful like
    //the description.
    for(int i=0;i<cards.length;++i){
        System.out.println("cards["+i+"]="+cards[i].toString()); 
    }
}

但是我不确定为什么要将它们都添加到对象'this.deck'对象和本地数组中。 我正在猜测,但是从此片段尚不清楚,如果您可以访问this.deck甚至需要阵列cards

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM