ListMultimap 不保持插入顺序
ListMultimap does not keep order of insertion
我目前正在编写电梯模拟程序。所以我需要创建一个 ListMultiMap "passengerFloorMap" 来存储以下值:
- 乘客编号
- 乘客起始楼层
- 乘客的目的地楼层
现在我需要洗牌 "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 循环(在 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]}
我发现问题应该是由内存引用引起的。
但我不知道如何解决这个问题。
希望你们中有人能提供帮助。
我猜你想说的是你期望第一个元素是 46=[3],而不是 1=[3]?
你弄错了 class。 ArrayListMultimap 仅保证保持键内元素的插入顺序,例如如果您插入 (46, 4) 后跟 (46, 3),您将得到 {46=[4, 3]}。但是,如果您使用不同的键插入,它会使用 HashMap 来确定该顺序。
如果你想保持键的插入顺序,你需要一个LinkedListMultimap。
我目前正在编写电梯模拟程序。所以我需要创建一个 ListMultiMap "passengerFloorMap" 来存储以下值:
- 乘客编号
- 乘客起始楼层
- 乘客的目的地楼层
现在我需要洗牌 "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 循环(在 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]}
我发现问题应该是由内存引用引起的。 但我不知道如何解决这个问题。 希望你们中有人能提供帮助。
我猜你想说的是你期望第一个元素是 46=[3],而不是 1=[3]?
你弄错了 class。 ArrayListMultimap 仅保证保持键内元素的插入顺序,例如如果您插入 (46, 4) 后跟 (46, 3),您将得到 {46=[4, 3]}。但是,如果您使用不同的键插入,它会使用 HashMap 来确定该顺序。
如果你想保持键的插入顺序,你需要一个LinkedListMultimap。