You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

电梯模拟中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());
}

修正点说明:

  1. 解决变量名混淆:去掉了多余的list/liste变量,直接用局部变量shuffledKeys存储洗牌后的ID,避免了成员变量和局部变量的引用混乱。
  2. 正确复制原数据:用putAll方法一次性把原Map中对应乘客的所有楼层数据(起始+目的)复制到新的randomOrder里,而不是硬编码占位值3。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:04:06