ListMultimap не сохраняет порядок вставки - PullRequest
0 голосов
/ 19 марта 2020

Я сейчас программирую симуляцию лифта. Поэтому мне нужно было создать ListMultiMap «passengerFloorMap» для хранения следующих значений:

  • идентификатор пассажира
  • startFloor пассажира
  • destinationFloor пассажира

Теперь мне нужно было перемешать ключи «passengerFloorMap». Это нужно было сделать, чтобы создать случайный порядок прибытия пассажиров. Например: сначала была «passengerFloorMap» {1 = [2,4], 1 = [3,4], 1 = [1,0], ...}

Затем были просто перемешаны ключи , потому что я хотел выбрать связанные значения позже:

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

После этого я создал другую функцию для создания нового MultiMapList "randomOrder". Там новый порядок ключей ([12, 130, 15, ...]) должен быть сохранен. Также я хотел получить связанные значения для этих ключей из «passangerFloorMap». Таким образом, результат должен выглядеть следующим образом: randomOrder = {12 = [3,1], 130 = [0,4], 15 = [2,1], ...}. Чтобы это произошло, я сохранил перемешанный список в 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));
    }
}

Теперь я хочу заполнить «randomOrder» ключами (в новом порядке после перемешивания) и связанными значениями. Для этого я создал for-l oop (в pickRandomPassenger): 3 - просто пример, будет заменен на правильное значение

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

Так что теперь проблема приходит. Если я вызываю randomOrder.put (liste.get (j), x), он получает значение, отличное от вызова randomOrder.put (liste.get (0), x). Также, если j = 0. Вот мой вывод:

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], ...]

Но, если я позвоню

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

, он получит:

randomOrder = {46=[3]}

Я обнаружил, что проблема должна быть вызвана ссылкой на память. Но я не знаю, как решить эту проблему. Надеюсь, кто-то из вас сможет помочь.

1 Ответ

0 голосов
/ 19 марта 2020

Полагаю, вы хотите сказать, что вы ожидали, что первый элемент будет 46 = [3], а не 1 = [3]?

У вас неправильный класс для этого. ArrayListMultimap гарантирует сохранение порядка вставки для элементов внутри ключа, например, если вы вставите (46, 4), а затем (46, 3), вы получите {46 = [4, 3]}. Но если вы вставляете с разными ключами, он использует HashMap для определения этого порядка.

Если вы хотите сохранить порядок вставки ключей, вам нужно LinkedListMultimap .

...