2012-03-11 2 views
1

私が書いているコードで少し問題があります。基本的に、私はカードのデッキのようなスタックコレクションをシャッフルしようとしていますが、何らかの理由で、私が使用している一時スタックの1つが完全に空にならず、次の実行で空のコレクション例外が発生しますまわり。私はコードと出力を手で追跡し、要素は一時的なスタック1に残っています(コードは下にあります)。私は本当になぜこれが起こっているのか分からない!これについての洞察があれば、本当に役に立ちます。ここで Fisher-Yatesのシャッフル時にJavaスタックに残っている要素は?

は、問題のメソッドへのリンクです:あなたはサイズが非常に縮小スタックをポップ場合 http://pastebin.com/cxJCmemZ

public void shuffleCards(LinkedStack<UnoCard> deck) { 
     int tempIndex; 
     LinkedStack<UnoCard> tempCardStack1 = new LinkedStack<UnoCard>(); 
     LinkedStack<UnoCard> tempCardStack2 = new LinkedStack<UnoCard>(); 

     //Fisher-Yates shuffle 
     for (int i = (deck.size() - 1); i >= 0; i--) { 
      tempIndex = ((int)(i * Math.random())); 

      System.out.println("i is: " + i); 
      System.out.println("tempIndex is: " + tempIndex); 

      //swap if cards are different 
      if (tempIndex != i) { 
       //pop face down cards up to first card onto temporary stack 
       System.out.println("Popping up to first card"); 
       for(int j = 0; j <= tempIndex; j++) { 
        UnoCard tempCard = faceDownCards.pop(); 
        System.out.println(tempCard.toString()); 
        tempCardStack1.push(tempCard); 
       } 

       //pop face down cards up to second card onto temporary stack 
       System.out.println("Popping up to second card"); 
       for(int j = (tempIndex + 1); j <= i; j++) { 
        UnoCard tempCard = faceDownCards.pop(); 
        System.out.println(tempCard.toString()); 
        tempCardStack2.push(tempCard); 
       } 

       //replace first card in second card position 
       System.out.println("Replacing first card"); 
       UnoCard tempCard = tempCardStack1.pop(); 
       System.out.println(tempCard.toString()); 
       faceDownCards.push(tempCard); 

       //place second card in temporary stack 
       System.out.println("Transferring second card"); 
       tempCard = tempCardStack2.pop(); 
       System.out.println(tempCard.toString()); 
       tempCardStack1.push(tempCard); 

       //replace temporary stack 
       System.out.println("Replacing second stack"); 
       for(int j = 0; j < tempCardStack2.size(); j++) { 
        tempCard = tempCardStack2.pop(); 
        System.out.println(tempCard.toString()); 
        faceDownCards.push(tempCard); 
       } 

       //replace second card in first card position 
       System.out.println("Replacing second card"); 
       tempCard = tempCardStack1.pop(); 
       System.out.println(tempCard.toString()); 
       faceDownCards.push(tempCard); 

       //replace temporary stack 
       System.out.println("Replacing first stack"); 
       for(int j = 0; j < tempCardStack1.size(); j++) { 
        tempCard = tempCardStack1.pop(); 
        System.out.println(tempCard.toString()); 
        faceDownCards.push(tempCard); 
       } 
      } 
     } 
    } 
+0

次回はコードを追加するだけです。それほど多くはありませんでした。一般的に、人々はコードへのリンクを辿ることを望んでいません(特に、そのリンクが将来消滅し、質問と回答の価値が低くなる可能性があるため)。 – AHungerArtist

+0

申し訳ありません、ここは新しいです。これを修正していただきありがとうございます! – lollercopter

答えて

2

のみサイズ/ 2回実行されるループのための

ので、終了ループがすべき実際には

while(!tempCardStack1.isEmpty()){ 
    tempCard = tempCardStack1.pop(); 
    System.out.println(tempCard.toString()); 
    faceDownCards.push(tempCard); 
} 
関連する問題