电梯模拟中ListMultimap洗牌键后填充新映射的异常问题排查
解决ListMultimap洗牌后填充出现连续键的问题
看起来你遇到的问题核心是变量名笔误,再加上填充逻辑没有正确复用原Map的数据,咱们一步步理清楚:
首先看你的代码:你在pickRandomPassanger方法里定义了局部变量list,但第一个循环里却写了liste.add(shuffledList.get(i))——这里的liste应该是你类里的另一个成员变量,里面存的是连续的1、2、3...数值,这就导致后续循环往randomOrder里塞的是错误的键列表,而非你洗牌后的乘客ID。
另外,你当前用randomOrder.put(liste.get(j), 3)只是存了固定值3,并没有把原passengerFloorMap里的起始楼层、目的楼层数据复制过去,这也不符合你的需求。
给你修正后的代码,既解决变量名问题,又完善了数据复制逻辑:
private List<Integer> shuffleKeyList(){ List<Integer> keySet = new ArrayList<>(passengerFloorMap.keySet()); Collections.shuffle(keySet); return keySet; } private void pickRandomPassenger(){ // 创建新的ListMultimap存储随机顺序的乘客数据 ListMultimap<Integer, Integer> randomOrder = ArrayListMultimap.create(); // 获取洗牌后的乘客ID列表 List<Integer> shuffledKeys = shuffleKeyList(); // 遍历洗牌后的ID,把原Map中对应的数据批量复制过来 for (Integer passengerId : shuffledKeys) { // 取出该乘客对应的起始楼层+目的楼层 Collection<Integer> floorData = passengerFloorMap.get(passengerId); // 批量添加到新的multimap中 randomOrder.putAll(passengerId, floorData); } // 现在验证一下,keySet()输出的就是洗牌后的顺序了 System.out.println("随机后的乘客ID顺序: " + randomOrder.keySet()); }
修正点说明:
- 解决变量名混淆:去掉了多余的
list/liste变量,直接用局部变量shuffledKeys存储洗牌后的ID,避免了成员变量和局部变量的引用混乱。 - 正确复制原数据:用
putAll方法一次性把原Map中对应乘客的所有楼层数据(起始+目的)复制到新的randomOrder里,而不是硬编码占位值3。 - 简化逻辑:直接增强for循环遍历洗牌后的列表,比下标循环更清晰不易出错。
如果你一定要保留类成员变量shuffledList,也可以这么写,注意要确保遍历的是正确的列表:
List<Integer> shuffledList = new ArrayList<>(); private List<Integer> shuffleKeyList(){ List<Integer> keySet = new ArrayList<>(passengerFloorMap.keySet()); Collections.shuffle(keySet); return keySet; } private void pickRandomPassenger(){ ListMultimap<Integer, Integer> randomOrder = ArrayListMultimap.create(); shuffledList = shuffleKeyList(); for (Integer passengerId : shuffledList) { randomOrder.putAll(passengerId, passengerFloorMap.get(passengerId)); } }
这样修改后,randomOrder的键顺序就会和洗牌后的列表完全一致了,不会再出现连续数值的问题。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

