Domanda

Per una lezione di programmazione sto creando un programma di blackjack per il primo compito a casa. Il professore ci ha dato una classe di carte campione, che include il metodo per aggiungerle a un mazzo. Per il suo mazzo, usa una ArrayList, che puoi facilmente Knuth Shuffle con il metodo Collections.shuffle ().

Tuttavia, questo metodo non funziona per gli stack (ovviamente), ma penso che una struttura Stack funzionerebbe meglio per questo programma perché potresti far scoppiare e spingere le carte dentro e fuori dal mazzo.

È stato utile?

Soluzione

Entrambi java.util.ArrayList<E> e < a href = "http://java.sun.com/javase/6/docs/api/java/util/Stack.html" rel = "noreferrer"> java.util.stack<E> implementa java.util.List<E> interfaccia e Collections.shuffle() accetta java.util.List<?> come parametro Dovresti essere in grado di passare un Stack in java.util.list<E>, a meno che tu non stia utilizzando un'implementazione dello stack diversa che non implementa <=>. In tal caso, ti consiglierei di passare a un'implementazione dello stack diversa.

Altri suggerimenti

Immagino sia molto più facile fare operazioni di stack su una ArrayList.

Uno stack è un elenco, quindi puoi chiamare Collections.shuffle () sul tuo stack.

Detto questo, Stack è una vecchia classe, come Vector e un po 'fuori moda. Oggi useresti un Dequeue (un coda a doppia estremità che funziona come una coda o uno stack) anziché uno stack ma , i dequeues non sono elenchi, quindi non possono essere mescolati.

Inoltre, puoi sempre mettere le tue carte in un Elenco, mescolarle e quindi aggiungerle tutte a un Dequeue

Non vi è alcun motivo per cui una struttura dello stack non dovrebbe essere anch'essa un accesso casuale (java.util.Stack sì, sebbene ciò abbia problemi propri). Oltre a ciò, puoi inserire gli elementi dello stack in una ArrayList, mescolarli e quindi rimandarli al tuo stack.

No, Fisher-Yates shuffle si basa sull'accesso casuale all'insieme di dati. È necessaria una raccolta che consenta di ottenere (indice int). Se hai bisogno di uno stack, usa un elenco. push e pop basta chiamare get (0) e aggiungere (0). È meglio che implementare alcune classi di stack personalizzate. Usa quello che hai, non inventare nuove classi.

La risposta di Adam è la migliore per uno stack. Per i giochi di carte, di solito uso un semplice arraylist e rimuovo elementi casuali. Non è necessario mescolare.

Mescola prima / mentre metti le carte in pila. Dal momento che uno shuffle Knuth correttamente implementato non consente la sostituzione di carte nella parte del mazzo già attraversata, puoi semplicemente metterle in pila mentre vai avanti ...

Poiché java non ti consente di trattare uno stack come un elenco di accesso casuale, basta copiarlo dallo stack in una ArrayList per fare la fase di shuffle (un ArrayList extra di 52 elementi che bussa non è un grosso problema)

il metodo Collections.shuffle () fa quello che non devi fare esplicitamente.

" Se l'elenco specificato non implementa l'interfaccia RandomAccess ed è di grandi dimensioni, questa implementazione di shuffle () scarica l'elenco specificato in un array prima di rimescolarlo e scarica nuovamente l'array mischiato nell'elenco. Questo evita il comportamento quadratico che risulterebbe dal mescolare un & Quot; accesso sequenziale & Quot; elenco in posizione. "

questo è ciò che dice la documentazione di Java sull'implementazione del metodo Collections.shuffle () quindi passare un java.util.Stack (un'implementazione dell'interfaccia java.util.List) dovrebbe funzionare ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top