如何改进这里的3层for循环?

来源:7-12 订单模块 - 判断是否已售座位

Sweet2021

2022-07-12

http://img.mukewang.com/szimg/62cd45c109d4c3d709010528.jpg

老师,这个地方有哪些优化的思路吗?

写回答

2回答

慕UI0546731

2023-08-09

下面是对给定代码的二分法优化,并使用中文解释:

List<MoocOrderT> list = moocOrderTMapper.selectList(entityWrapper);
String[] seatArrs = seats.split(",");
// 有任何一个编号匹配上,则直接返回失败
for (MoocOrderT moocOrderT : list) {
    String[] ids = moocOrderT.getSeatsIds().split(",");
    Arrays.sort(ids); // 对ids数组进行排序
    for (String seat : seatArrs) {
        if (binarySearch(ids, seat)) {
            return false;
        }
    }
}

// 二分查找
private boolean binarySearch(String[] arr, String target) {
    int left = 0;
    int right = arr.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        int cmp = arr[mid].compareToIgnoreCase(target);
        if (cmp == 0) {
            return true;
        } else if (cmp < 0) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return false;
}

代码优化解释:

1. 首先,对每个 `MoocOrderT` 对象的 `ids` 数组进行排序,以便使用二分查找。

2. 使用二分查找算法 `binarySearch` 来查找 `seatArrs` 中的每个元素是否在排序后的 `ids` 数组中。

3. 如果找到匹配的编号,直接返回 `false` ,因为只要有一个匹配,就表示失败。


通过使用二分法优化,可以在较大的数据集上提高查找效率。

0
0

Allen

2022-07-28

有好多思路, 最简单的就是可以考虑把表改成纵表,一个查询就出来了

0
2
Allen
回复
Sweet2021
实际上就是通过数据库纵表 或者放入缓存,这样单次查询就出来了,不过咱们课上时间不够,所以换了一种而已
2022-07-29
共2条回复

Dubbo主流版本打造仿猫眼项目 理解微服务核心思想

实战Dubbo项目+面试技巧,老司机带你畅游微服务

1410 学习 · 582 问题

查看课程