我的代码是这样的:
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;
/**
*
* @author Matt
*/
public class Deck {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Random r = new Random();
String[][] DeckOfCards = new String[13][4];
int i;
int j;
int k;
String suit[] = new String[4];
String number[] = new String[13];
ArrayList draw = new ArrayList();
//setting up the deck
suit[0]="Diamonds, ";
suit[1]="Clubs, ";
suit[2]="Hearts, ";
suit[3]="Spades, ";
number[0]="Ace of ";
number[1]="Two of ";
number[2]="Three of ";
number[3]="Four of ";
number[4]="Five of ";
number[5]="Six of ";
number[6]="Seven of ";
number[7]="Eight of ";
number[8]="Nine of ";
number[9]="Ten of ";
number[10]="Jack of ";
number[11]="Queen of ";
number[12]="King of ";
//dealing the initial hand
for(j=0;j<3;j++){
for(i=0;i<12;i++){
DeckOfCards[i][j]=""+number[i]+suit[j];
draw.add(DeckOfCards[i][j]);
//System.out.println(DeckOfCards[i][j]);
}
//System.out.println("");
// System.out.println("");
}
ArrayList drawn = new ArrayList();
ArrayList hand = new ArrayList();
int u;
for(u=1;u<6;u++){
k=r.nextInt(52);
if(!drawn.contains(k)){
//System.out.println(draw.get(k));
hand.add(u+" "+draw.get(k).toString());
drawn.add(k);
}
else{
u--;
}
}
System.out.println(hand.toString());
但是最后一个if语句:
if(!drawn.contains(k)){
hand.add(u+" "+draw.get(k).toString());
drawn.add(k);)
总是停止编译说我需要为新变量分配一个返回值吗?在if语句之前已经为k分配了一个值。当我将随机k语句放在if语句中时,它似乎有效,但这使它变得毫无价值,不是吗?编辑器本身没有错误,但是当我编译时,它给了我这个:
线程中的异常&#34; main&#34; java.lang.IndexOutOfBoundsException:索引:41,大小:36 at java.util.ArrayList.rangeCheck(ArrayList.java:635) at java.util.ArrayList.get(ArrayList.java:411) 在deck.Deck.main(Deck.java:74) Java结果:1 建立成功(总时间:0秒)
我完全没有关于如何解决这个问题的想法。
答案 0 :(得分:1)
你的牌组中没有足够的牌。
您正在获取并索引输出边界,因为您尝试访问不存在的draw.get(41)
,因为draw
的大小只有36。这是因为draw
的初始化不正确。您的错误代码是:
for(j=0;j<3;j++){
for(i=0;i<12;i++){
DeckOfCards[i][j]=""+number[i]+suit[j];
draw.add(DeckOfCards[i][j]);
//System.out.println(DeckOfCards[i][j]);
}
//System.out.println("");
// System.out.println("");
}
在上面只增加了3套西装,每件西装12件。 (36卡)。你应该增加4件套装,每件套装13件。也许你的意思是说小于OR EQUAL TOO for (j=0; j<=3; j++)
而不仅仅是少于。
答案 1 :(得分:0)
你的问题是你正在尝试绘制52张随机牌中的一张,但你的牌组中只有36张牌:
for(j=0;j<3;j++){ // should be j<4
for(i=0;i<12;i++){ // should be i<13
DeckOfCards[i][j]=""+number[i]+suit[j];
draw.add(DeckOfCards[i][j]);
//System.out.println(DeckOfCards[i][j]);
}
//System.out.println("");
// System.out.println("");
}