72 votos

Llenar un Array booleano en Java

Como bastante verde de Java programador me he fijado el fuerte desafío de tratar de escribir una simple aventura de texto. Como era de esperar, me he encontrado con dificultades ya!

Estoy tratando de dar mi Ubicación clase de propiedad a la tienda que sale de ella contiene. Yo he utilizado una matriz de tipo boolean para esto, esencialmente a mantener valores verdadero/falso que representan a cada salida. No estoy del todo convencido de que

a) esta es la forma más eficiente de hacer esto y

b) que estoy usando el código de la derecha para rellenar la matriz.

Agradecería cualquier y todos los comentarios, incluso si se trata de un código completo de sobre-recorrido!

En la actualidad, al crear instancias de una Ubicación generar una Cadena que me envíe a través de la setExits método:

    String e = "N S U";
    secretRoom.setExits(e);

En la Ubicación de clase, setExits se parece a esto:

public void setExits(String e) {
    if (e.contains("N"))
        bexits[0] = true;
    else if (e.contains("W"))
        bexits[1] = true;
    else if (e.contains("S"))
        bexits[2] = true;
    else if (e.contains("E"))
        bexits[3] = true;
    else if (e.contains("U"))
        bexits[4] = true;
    else if (e.contains("D"))
        bexits[5] = true;
}

Voy a ser honesto, creo que esto se ve particularmente torpe, pero yo no podía pensar en otra manera de hacerlo. Tampoco estoy completamente seguro de que ahora la forma de escribir la getExits método...

Cualquier ayuda será bienvenida!

127voto

gexicide Puntos 11040

Los más eficientes y expresiva forma es la siguiente:

Utilice enum s como salidas y uso un EnumSet almacenarlos. EnumSet es un sistema eficaz Set aplicación que utiliza un campo de bits para representar las constantes enum.

Aquí está Cómo puedes hacerlo:

public enum Exit { North, West, South, East, Up, Down; }

EnumSet<Exit> set = EnumSet.noneOf(Exit.class); // An empty set.

// Now you can simply add or remove exits, everything will be stored compactly

set.add(Exit.North); // Add exit
set.contains(Exit.West); // Test if an exit is present
set.remove(Exit.South); //Remove an exit

Enum conjunto guardará todas las salidas en una sola long internamente, así que su código es expresiva, rápido y ahorra mucha memoria.

29voto

Ross Drew Puntos 3562

¿Hay alguna razón por la que usted está haciendo esto con Strings y no se que pasa en booleans, es decir,

public void setExits(boolean N, boolean E, boolean S, boolean W, boolean U, boolean D) 

O tener incubadoras?

public void setNorthOpen(boolean open)
{
  bexits[4] = open;
}

En segundo lugar, ¿por qué el almacenamiento de las salidas como una matriz de booleanos, es un pequeño conjunto finito, ¿por qué no

boolean N,S,E,W,U,D;

Como entonces no es necesario hacer un seguimiento del número que en la matriz de cada dirección.

También

Esta es una respuesta correcta (si no del todo óptima como la de @gexicide) pero estoy totalmente de animar a cualquiera a mirar a las otras respuestas aquí para un aspecto interesante en cómo las cosas se pueden hacer en Java de diferentes maneras.

Para referencia en el futuro

Código que funciona pertenece a la Revisión del Código, el no Stack Overflow. Aunque como @kajacx señalado, este código no debería-de hecho - trabajo.

15voto

kajacx Puntos 2690

OK, primero que nada, su setExits() método no funciona como se pretende, encadenado if-elseif será máximo de ejecución 1 rama de código, por ejemplo:

if (e.contains("N"))
    bexits[0] = true;
else if (e.contains("W"))
    bexits[1] = true;

Incluso si e contiene N y W, solo bexits[0] . También este método sólo añadir las salidas (por ejemplo llamando setExits("") no borrar cualquier salidas.

Me gustaría cambiar ese método:

bexits[0] = e.contains("N");
bexits[1] = e.contains("W");
...

También, yo definitivamente no recordar que el norte está en el índice 0, el oeste en 1, ... por lo que una práctica común es su nombre de los índices de uso final constantes estáticas:

public static final int NORTH = 0;
public static final int WEST = 1;
...

A continuación, puede escribir en su setExits método:

bexits[NORTH] = e.contains("N");
bexits[WEST] = e.contains("W");
...

(mucho más readible)

Por último, si desea que su código es aún más claro, usted puede hacer una Exits clase que representa disponible salidas, y respaldado por la matriz de tipo boolean. A continuación, en el lugar donde usted crea su Cadena, puede crear esta clase de lugar y ahorrarte trabajo con la generación y, a continuación, el análisis de una cadena.

EDICIÓN:

como @gexicide respuestas, no es realmente práctico clase EnumSet que probablemente sería mejor para la representación de las salidas de bollean matriz.

9voto

Tim B Puntos 19851

La EnumSet en la otra respuesta es la mejor manera de hacer esto, yo sólo quería añadir una cosa más, aunque para el futuro, cuando usted comience a buscar no sólo en si se puede mover, pero donde se están moviendo.

Así como EnumSet también tiene EnumMap.

Si se define una Sala de clase/interfaz, a continuación, en el interior de la Sala de clase puede tener

Map<Direction, Room> exits = new EnumMap<>(Direction.class);

Ahora usted puede agregar sus enlaces en el mapa de la siguiente manera:

exits.put(Direction.NORTH, theRoomNorthOfMe);

A continuación, el código para mover entre las habitaciones puede ser muy de propósito general:

Room destination=currentRoom.getExit(directionMoved);

if (destination == null) {
    // Cannot move that way
} else {
    // Handle move to destination
}

7voto

niekname Puntos 109

Crearía una enumeración de salida y en la localización clase acaba de establecer una lista de objetos de salida.

Así que sería algo así como:

public enum Exit { N, S, E, W, U, D }

List<Exit> exits = parseExits(String exitString);
location.setExits(exits);

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X