Элементы, оставленные в стеке Java, когда тасование Фишера-Йейтса? - PullRequest
1 голос
/ 12 марта 2012

У меня небольшие проблемы с кодом, который я пишу. По сути, я пытаюсь «перемешать» коллекцию стеков, как колоду карт, но по какой-то причине один из используемых мной временных стеков не будет полностью опустошен, и это приведет к исключению пустой коллекции при следующем запуске. вокруг. Я отследил код и вывод вручную, и элементы остались во временном стеке 1 (код ниже). Я действительно не уверен, почему это происходит! Если у вас есть какое-то понимание этого, это было бы очень полезно.

Вот ссылка на метод проблемы: 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);
                }
            }
        }
    }

1 Ответ

2 голосов
/ 12 марта 2012

если вы вставляете стек, размер уменьшается, поэтому цикл for будет выполняться только для размера / 2 раза

, поэтому конечные циклы должны быть действительно

while(!tempCardStack1.isEmpty()){
    tempCard = tempCardStack1.pop();
    System.out.println(tempCard.toString());
    faceDownCards.push(tempCard);
}
...