Pregunta

Para una clase de programación, estoy creando un programa de blackjack para la primera tarea. El profesor nos ha dado una clase de tarjeta de muestra, que incluye el método para agregarlos a un mazo. Para su mazo, ella usa una ArrayList, que puede Knuth Shuffle fácilmente con el método Collections.shuffle ().

Sin embargo, ese método no funciona para las pilas (obviamente), pero creo que una estructura de pila funcionaría mejor para este programa porque puedes hacer estallar y empujar cartas dentro y fuera del mazo.

¿Fue útil?

Solución

Ambos java.util.ArrayList<E> y < a href = "http://java.sun.com/javase/6/docs/api/java/util/Stack.html" rel = "noreferrer"> java.util.stack<E> implementa el java.util.List<E> interfaz, y Collections.shuffle() toma un java.util.List<?> como un parámetro Debería poder pasar un Stack a java.util.list<E>, a menos que esté usando una implementación de pila diferente que no implemente <=>. Si es así, le aconsejaría que cambie a una implementación de pila diferente.

Otros consejos

Supongo que es mucho más fácil hacer operaciones de pila en una ArrayList.

Una pila es una lista, por lo que puede llamar a Collections.shuffle () en su pila.

Dicho esto, Stack es una clase antigua, como Vector y algo anticuada. Hoy en día usaría una Dequeue (a cola doble que funciona como una cola o una pila) en lugar de una pila pero , las colas no son listas, por lo que no se pueden barajar.

Además, siempre puedes poner tus cartas en una Lista, barajarlas y luego agregarlas todas a una Dequeue

No hay ninguna razón por la cual una estructura de pila no deba ser también de acceso aleatorio (java.util.Stack sí, aunque eso tiene sus propios problemas). Aparte de eso, puede hacer estallar los elementos de la pila en una ArrayList, barajarlos y luego volver a colocarlos en su pila.

No, la mezcla aleatoria de Fisher-Yates se basa en el acceso aleatorio al conjunto de datos. Necesita alguna Colección que permita obtener (int index). Si necesita una pila, simplemente use una lista. push y pop solo llame a get (0) y agregue (0). Esto es mejor que implementar alguna clase de pila personalizada. Usa lo que tienes, no inventes nuevas clases.

La respuesta de Adam es la mejor para una pila. Para los juegos de cartas, lo que suelo usar es una simple lista de matrices y eliminar elementos aleatorios. No se requiere barajar.

Simplemente baraja antes / mientras pones las cartas en la pila. Dado que un Knuth shuffle implementado correctamente no permite el reemplazo de cartas en la parte del mazo ya atravesado, simplemente puede colocarlas en la pila a medida que avanza ...

Dado que Java no le permitirá tratar una pila como una lista de acceso aleatorio, simplemente copie de la pila en una ArrayList para hacer la fase de barajado (un extra de 52 elementos ArrayList no es gran cosa)

el método Collections.shuffle () hace que no tenga que hacerlo explícitamente.

" Si la lista especificada no implementa la interfaz RandomAccess y es grande, esta implementación de shuffle () volca la lista especificada en una matriz antes de barajarla, y vuelve a volcar la matriz aleatoria en la lista. Esto evita el comportamiento cuadrático que resultaría de barajar un & "; Acceso secuencial &"; lista en su lugar. "

esto es lo que dice la documentación de Java sobre la implementación del método Collections.shuffle () entonces pasar un java.util.Stack (una implementación de la interfaz java.util.List) debería funcionar ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top