Skip to content

背景

PM 需要在商品列表页,间隔几个插入一个运营广告位。

例如从最开始,间隔 4 个插入一个广告位,支持跨页。

思路

根据首次插入的位置 start,可以分三种情况讨论;

第一种:start 大于当前页,直接跳过不处理;

第二种:start 位于当前页,那么开始插入的位置有 startIndex = start - len

第三种:start 小于当前页,需要考虑跨页的问题;

编码

java
/**
 * 间隔指定数量插入运营位
 *
 * @param list  原始列表数据
 * @param page  当前页码
 * @param size  分页大小
 * @param ads   插入的运营位列表
 * @param start 指定插入的起始位置
 * @param gap   间隔数量
 * @param <T>   数据类型
 */
public <T> void insertAds(List<T> list, int page, int size, List<T> ads, int start, int gap) {
    int len = (page - 1) * size;
    // 之前页已经出现过的广告位数量
    int shown = 0;
    int startIndex;
    if (start >= len + size) {
        // 本页还不能插入广告
        return;
    } else if (start >= len) {
        startIndex = start - len;
    } else {
        // 之前页余下来插入广告位的长度,加余取余保证为正数
        int rest = (len - start) % gap;
        shown = (len - start) / gap;
        if (rest > 0) shown++;
        startIndex = (gap - rest) % gap;
    }
    if (shown >= ads.size()) {
        // 没有可用的广告了
        return;
    }
    // 本页插入广告的第一个位置
    int i = startIndex;
    // 广告位数组的下标
    int j = shown;
    while (i < list.size() && j < ads.size()) {
        list.add(i++, ads.get(j++));
        i += gap;
    }
}

基于 MIT 许可发布