背景
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;
}
}