查看: 61|回复: 1

java代码-优化一段代码的时间复杂度从 O(n*m) 到 O(n+m)

[复制链接]

7

主题

1

回帖

54

积分

管理员

积分
54
发表于 2025-12-5 19:12:39 | 显示全部楼层 |阅读模式
  1. if (ObjectUtil.isNotEmpty(pageResult) && ObjectUtil.isNotEmpty(pageResult.getList())){
  2.     List<Long> collect = pageResult.getList()
  3.             .stream()
  4.             .map(monitorRptRecordDO::getKeySupervisionUnit)
  5.             .filter(StrUtil::isNotBlank)
  6.             .filter(s -> s.trim().matches("\\d+"))
  7.             .map(Long::valueOf)
  8.             .toList();
  9.     List<KeyUnitQueryDO> list = soilGroundwaterMainService.getSoilGroundwaterMainByIds(collect);
  10.     for (monitorRptRecordDO monitorRptRecordDO : pageResult.getList()) {
  11.         if (ObjectUtil.isNotEmpty(list)){
  12.             List<KeyUnitQueryDO> list1 = list.stream().filter(x -> ObjectUtil.equal(x.getId().toString(), monitorRptRecordDO.getKeySupervisionUnit())).toList();
  13.             if (!list1.isEmpty()){
  14.                 monitorRptRecordDO.setKeyMonitorUnitName(list1.getFirst().getKeySupervisionUnit());
  15.             }

  16.         }
  17.     }

  18. }
复制代码
修改后:
  1. if (ObjectUtil.isNotEmpty(pageResult) && ObjectUtil.isNotEmpty(pageResult.getList())) {

  2.     // 收集 ID(O(n))
  3.     List<Long> collect = pageResult.getList().stream()
  4.             .map(monitorRptRecordDO::getKeySupervisionUnit)
  5.             .filter(StrUtil::isNotBlank)
  6.             .filter(s -> s.trim().matches("\\d+"))
  7.             .map(Long::valueOf)
  8.             .toList();

  9.     // 批量查询(O(m))
  10.     List<KeyUnitQueryDO> list = soilGroundwaterMainService.getSoilGroundwaterMainByIds(collect);

  11.     // 关键优化:list → Map(O(m))
  12.     Map<String, KeyUnitQueryDO> map = list.stream()
  13.             .collect(Collectors.toMap(
  14.                     x -> x.getId().toString(),   // key
  15.                     x -> x,                      // value
  16.                     (a, b) -> a                  // 防止重复 key 报错
  17.             ));

  18.     // 直接 O(1) 查 Map(O(n))
  19.     for (monitorRptRecordDO monitorRptRecordDO : pageResult.getList()) {

  20.         if (ObjectUtil.isNotEmpty(map)) {
  21.             // 核心在这里 (O(1))因为map的时间复杂度就是o(1)
  22.             KeyUnitQueryDO keyUnit = map.get(monitorRptRecordDO.getKeySupervisionUnit());

  23.             if (ObjectUtil.isNotEmpty(keyUnit)) {
  24.                 monitorRptRecordDO.setKeyMonitorUnitName(
  25.                         keyUnit.getKeySupervisionUnit()
  26.                 );
  27.             }
  28.         }
  29.     }
  30. }
复制代码


0

主题

1

回帖

8

积分

新手上路

积分
8
发表于 2025-12-5 19:14:40 来自手机 | 显示全部楼层
学到了楼主😎
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|VIHUB实验室

相关侵权、举报、投诉及建议等,请发 E-mail:itmateng@163.cn

Powered by Discuz! X5.0 © 2001-2025 Discuz! Team.|津ICP备2021008739号-2|津ICP备2021008739号-2

在本版发帖
关注公众号
QQ客服返回顶部
快速回复 返回顶部 返回列表