Esto es algo que me tiene un poco perplejo. Estoy tratando de hacer una lista de matriz que contenga objetos, y cada objeto tendrá una cadena asociada.

Por ejemplo, supongamos que tengo esta lista de salas adyacentes ...

ArrayList<Object> adjacentRooms = new ArrayList<Object>();

Podría agregar objetos Room a esa lista de matriz que están adyacentes a cualquier tema ... sin embargo, cuando agrego a la lista de matriz con adjacentRooms.add(x); (donde x podría ser un objeto Tipo de habitación) ... también me gustaría agregar una cuerda a esa posición. Por ejemplo adjacentRooms.add(x, "north"); .. <- ¿ahora sé que eso no es posible a menos que haga algo como una lista de matriz 2D posiblemente?

Entonces, después de un tiempo de investigación, estoy perdido. Simplemente no puedo entender cómo agregar un objeto con una cadena asociada en una lista de matriz 2D ...

0
Griffin Bender 13 oct. 2017 a las 04:20

4 respuestas

La mejor respuesta

En lugar de un List use un Map: que puede "asignar" un valor a otro y almacenarlo en una colección.
Algo como esto:

Map<String, Room> adjacentRooms = new HashmMap<>();

adjacentRooms.put("north", room);
adjacentRooms.get("east");

Es posible que desee utilizar constantes para asegurarse de que los valores sean "discretos".

Tiene un inconveniente, aunque: no puede asignar más de 1 valor a una clave, es decir, más de 1 Room s a una dirección ...

1
Usagi Miyamoto 13 oct. 2017 a las 01:38

Un ArrayList solo puede contener un tipo de datos. Pero tengo curiosidad de por qué no puede asociar una cadena como miembro en el Objeto del que está hablando. Como desea una lista de arrays en 2D, supongo que la cadena y la "habitación" están relacionadas

Object foo = new Object();
foo.data = "your string"
adjacentRooms.add(foo);

Acceso por

adjacentRooms.get(index).data

Sin embargo, si debe hacerlo, puede hacer una 2d ArrayList, pero se vuelven molestos ArrayList<ArrayList<String> > list = new ArrayList();

El acceso sería algo así como list.get(i).get(k) con 'i' que se refiere al índice de ArrayList of Strings, yk que se refiere al índice de una cadena en esa 'i' ArrayList.

Sin embargo, esa estructura no almacena el "Objeto" del que estás hablando ...

Espero que eso ayude.

1
Brian W 13 oct. 2017 a las 01:36

La "matriz" en ArrayList describe la forma en que se implementa la lista.

Una lista siempre es unidimensional. Cuando necesite más dimensiones, use objetos en su lista que puedan almacenar información adicional.

Por lo tanto, cree una nueva clase que contenga sus datos (por ejemplo, Habitación detallada con sala de miembros y una cadena) o use una clase de colección existente. Este último sería un diseño pobre, pero aún así ... podría ser Lista, por ejemplo, para que termines con List<List<Object>> .

1
hairsplitter 19 oct. 2017 a las 11:46

Si vas a crear tu propia clase ... esto es lo que hice ...

public class AdjacentRoom {
    private Room room;
    private String direction;
    public AdjacentRoom(Room room, String direction) {
        this.room = room;
        this.direction = direction;
    }
    public Room getRoom(){
        return room;
    }
    public String getDirection(){
        return direction;
    }
}

También, por ejemplo, aquí hay una clase de sala básica ...

public class Room {
    private String name;
    public Room(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

Lo que todo esto me permite hacer es ...

//Firstly i can create a room...
Room testRoom = new Room("Test Room");
//If i change my array list in the question to an AdjacentRoom list...
ArrayList<AdjacentRoom> adjacentRooms = new ArrayList<AdjacentRoom>();
//I can add rooms and strings to it like this..
adjacentRooms.add(new AdjacentRoom(testRoom, "north"));

Ahora todavía puedo acceder a cada uno de los métodos de las habitaciones mientras también imprimo cada cadena o 'dirección' asociada a cada habitación ... Por ejemplo ...

for(AdjacentRoom room : adjacentRooms){
        System.out.println(room.getRoom().getName() + " " + room.getDirection());
}

Si bien esta es una solución genial y de personalización, usar un mapa como en la respuesta de Usagi Miyamoto (link) es ideal para esta situación.

0
Griffin Bender 26 feb. 2018 a las 20:56