Java处理Excel权限导入数据时何时需要对Map元素进行排序?
问题核心原因
你现有代码的问题出在put逻辑会直接覆盖相同角色对应的权限列表:每遇到一次对应角色,就会用仅包含当前行权限的单元素列表替换掉旧列表,最终每个角色只会保留最后一行对应的权限,和Excel行的顺序没有关系。
实现方案
不需要提前排序/分组处理
不管用HashMap还是TreeMap都可以直接在逐行读取的过程中完成分组,不需要额外先对Excel内容做排序:
Map<Integer, List<UUID>> userRolePermissionMap = new HashMap<>(); // 逐行读取Excel的循环逻辑 while (/* 还有下一行 */) { // 读取当前行的角色和权限 Integer role = Integer.parseInt(cellList.get(USER_ROLE)); UUID permission = UUID.fromString(cellList.get(PERMISSON_UUID)); // 分组逻辑:不存在则初始化列表 userRolePermissionMap.computeIfAbsent(role, k -> new ArrayList<>()) .add(permission); }
如果你的JDK版本不支持computeIfAbsent,可以用常规判断写法:
List<UUID> permissions = userRolePermissionMap.get(role); if (permissions == null) { permissions = new ArrayList<>(); userRolePermissionMap.put(role, permissions); } permissions.add(permission);
关于TreeMap的使用
TreeMap的作用是对Key做排序,如果你后续构造PermissionRequest传入仓库的时候,要求必须按照用户角色的顺序执行操作,才需要使用TreeMap,否则用默认的HashMap就足够满足需求。
如果要使用TreeMap,只需要修改Map的初始化语句即可,其他分组逻辑完全不变:
// 按照角色ID自然升序排序 Map<Integer, List<UUID>> userRolePermissionMap = new TreeMap<>();
构造PermissionRequest对象
分组完成后直接遍历Map的键值对即可构造请求对象:
List<PermissionRequest> requestList = new ArrayList<>(); for (Map.Entry<Integer, List<UUID>> entry : userRolePermissionMap.entrySet()) { PermissionRequest request = new PermissionRequest(); // 注意这里要把Integer转成你定义的UserRole枚举类型,比如UserRole.valueOf(entry.getKey()) request.setUserRole(/* 转换后的UserRole对象 */); request.setPermissionUuidList(entry.getValue()); requestList.add(request); } // 把requestList传给仓库执行创建操作即可
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

