2015-06-24 136 views
0

我寫了這個程序來初始化和創建一副牌,洗牌,然後交出N張牌。儘管每次編譯都會順利進行,但是當我運行該程序時,它會拋出一個不同的ArrayIndexOutOfBounds(:52或54)。我使用System.out.println(1)檢查了錯誤,更改和交換了索引,更改了數組的長度等等。但我很難過......也許你能幫助我?爲什麼在這個程序中出現「ArrayIndexOutOfBounds」錯誤?

public class Deal 
{ 

public static void main(String[] args) 
{ 

    int N = Integer.parseInt(args[0]); 
    int hand = 5; 

    String[] rank = 
    { 
     "2", "3", "4", "5", "6", "7", "8", "9", "10", 
     "Jack", "Queen", "King", "Ace" 
    }; 

    String[] suit = {"Spades", "Hearts", "Clubs", "Diamonds"}; 

    // Create Deck 
    String[] deck = new String[rank.length * suit.length]; 

    // Fill the deck with cards 
    for (int i = 0; i < suit.length; i++) 
    { 
     for (int j = 0; j < rank.length; j++) 
     { 
      //System.out.println(1); 
      deck[rank.length*i + j] = rank[j] + " of " + suit[i]; 
      System.out.println(deck[rank.length*i +j]); 
     } 
    } 

    // Shuffle deck 
    for (int i = 0; i < deck.length; i++) 
    { 
     int r = i + (int)(Math.random() * (N-1)); 
     String t = deck[i]; 
     deck[i] = deck[r]; 
     deck[r] = t; 
    } 

    // Count number of cards dealt 
    int counter = 0; 

    while (N != 0 && counter <= deck.length) 
    { 
     for (int i = counter; i < hand + counter; i++) 
     { 
      System.out.println(deck[i]); 
      counter++; 
     } 

     N--; 
     System.out.println(); 
    } 
} 
} 
+1

你可以分享堆棧跟蹤嗎? –

回答

3

的問題是在你的洗牌代碼:

for (int i = 0; i < deck.length; i++) 
{ 
    int r = i + (int)(Math.random() * (N-1)); 
    String t = deck[i]; 
    deck[i] = deck[r]; 
    deck[r] = t; 
} 

有沒有保證r將在範圍 - 只要i內結束的N得到,它可能會失敗取決於隨機生成的數字。

更好:使用Collections.shuffle

Collections.shuffle(Arrays.asList(deck)); 

當你定,你會然後這裏有一個問題:

while (N != 0 && counter <= deck.length) 
{ 
    for (int i = counter; i < hand + counter; i++) 
    { 
     System.out.println(deck[i]); 

你有什麼期望時counter == deck.length發生?

基本上,答案像這樣所有問題包括以下步驟:

  • 摸出其中代碼失敗
  • 工作如何/爲什麼你會得到一個無效的指數
  • 制定出你實際上想要做的,以便保持在陣列的範圍內
  • 實施變化
+0

非常感謝您的回答。我通過改變N-1在 int r = i +(int)(Math.random()*(N-1)); 對Ni和while條件以及.. –

+0

@SamuelNuzbrokh:如果你打算保留混洗代碼,我建議使用'java.util.Random'而不是調用'Math.random()'和相乘...但我仍然建議使用'Collections.shuffle'來代替... –

相關問題