ListMultimap no guarda orden de inserción

María:

Actualmente estoy programando una simulación de un ascensor. Así que necesitaba para crear un ListMultiMap "passengerFloorMap" para almacenar los valores siguientes:

  • Identificación de pasajeros
  • a partir piso de pasajeros
  • destinationFloor de pasajeros

Ahora que necesitaba para barajar las teclas de "passengerFloorMap". Esto era necesario hacer, para crear un orden aleatorio de los pasajeros que llegan. Por ejemplo: Primero fue "passengerFloorMap" {1 = [2,4], 1 = [3,4], 1 = [1,0], ...}

A continuación, se barajan sólo las llaves, porque quería recoger los valores asociados más tarde:

`private List<Integer> shuffleKeyList(){
        keySet = new ArrayList<>(passengerFloorMap.keySet());
        Collections.shuffle(keySet); 
        return keySet;
 }
` Return example: [12, 130, 15, ...]

Después creé otra función para crear el nuevo MultiMapList "randomOrder". Allí, el nuevo orden de teclas ([12, 130, 15, ...]) deben ser almacenados. También quería obtener los valores asociados a estas teclas de "passangerFloorMap". Así, el resultado debe ser similar a esto: randomOrder = {12 = [3,1], 130 = [0,4], 15 = [2,1], ...}. Para que esto suceda Almacené la lista arrastrando los pies en un ArrayList:

List<Integer> shuffledList = new ArrayList<>();

private List<Integer> shuffleKeyList(){
    List<Integer> keySet = new ArrayList<>(passengerFloorMap.keySet());
    Collections.shuffle(keySet); 
    return keySet;
}

private void pickRandomPassanger(){
    ListMultimap<Integer, Integer> randomOrder = ArrayListMultimap.create(); 
    ArrayList<Integer> list = new ArrayList<>();
    shuffledList = shuffleKeyList();

    for (int i = 0; i < shuffledList.size(); i++){
        liste.add(shuffledList.get(i));
    }
}

Ahora quiero llenar "randomOrder" con las teclas (en el nuevo orden después aleatoria) y los valores asociados. Por esta creé una for-loop (en pickRandomPassenger): 3 es sólo un ejemplo, sería reemplazado por valor correcto

for(int j = 0; j < liste.size(); j++){
    randomOrder.put(liste.get(j), 3);
}

Así que ahora el problema llega. Si llamo randomOrder.put (liste.get (j), x) se recupera valor diferente de llamar randomOrder.put (liste.get (0), x). Además, si j = 0. Aquí está mi salida:

keySet = [46, 39, 81, 38, 34, 87, 20, 71, 32,...]
list = [46, 39, 81, 38, 34, 87, 20, 71, 32,...]
randomOrder = {1=[3], 2=[3], 3=[3], 4=[3], 5=[3], 6=[3], 7=[3], 8=[3], 9=[3], ...]

Pero, si la llamada I

randomOrder.put(list.get(0), 3) 

se recupera:

randomOrder = {46=[3]}

Descubrí que el problema debe ser algo causado por la memoria de referencia. Pero no sé cómo resolver este problema. Esperemos que alguien de ustedes podría ayudar.

GreyFairer:

Creo que lo que quiere decir es que se espera que el primer elemento a ser 46 = [3], no 1 = [3]?

Tienes la clase equivocada para eso. ArrayListMultimap sólo garantiza para mantener el orden de inserción para los elementos dentro de una clave, por ejemplo, si se inserta (46, 4) seguido de (46, 3), se llega a {46 = [4, 3]}. Pero si se inserta con llaves diferentes, utiliza HashMap para determinar ese orden.

Si desea mantener el orden de inserción de llaves, se necesita un LinkedListMultimap .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=318941&siteId=1
Recomendado
Clasificación