自定义分页算法来计算要显示的页面

Rya*_*son 3 algorithm paging

我正在为自定义谷歌地图控件制作自定义数据寻呼机.控件需要确定要显示的页面范围.例如,如果用户在第6页上,则控件必须显示第1页到第10页.如果用户在第37页上,则控件必须显示第30页到第40页.

我可用的变量是:

X - 总结果(地图上的点)
Y - 当前页面大小.即每页的点数.
Z - 显示当前页面
Q - 要显示的页码数量(常量为10)

我想出了:

起始指数 = Z - (Z%Q)
结束指数 = Z - (Z%Q)+ Q.

但是,当当前页面小于10时,这不起作用.它也不能确定是否达到最大页面,即我们总是显示10的全范围.但是,如果我们显示范围30-40最后一页实际上可能是38.

如果有人能想出更优雅的算法,我们将不胜感激.

小智 9

如果从章节的角度思考,可能会更容易.

假设每组页面都是章节,章节从0,1,2开始编号,......

然后,rth章节有该范围内的页面

Q r + 1 <= page <= Q(r + 1)

现在考虑楼层(页面/ Q).如果页面不是Q的倍数,则为r,否则为r + 1.

给定r,您可以找到章节的页面为Lower = Q r + 1和更高= min(max,Q(r + 1)).

所以你可以做到这一点.

if (Z < 1 || Z > max_page) { error;}

if (Z % Q == 0) {
    r = Z/Q - 1; // integer division, gives floor.
}
else {
    r = Z/Q; // floor.
}

Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);
Run Code Online (Sandbox Code Playgroud)

要摆脱if,你现在可以替换它

if (Z < 1 || Z > max_page) { error;}

r = (Z-1)/Q;
Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);
Run Code Online (Sandbox Code Playgroud)

这是因为:

Q r + 1 <= Z <= Q(r + 1)当且仅当

Q r <= Z-1 <= Q r +(Q-1).

因此楼层((Z-1)/ Q)= r.


Ign*_*ams 5

开始了:

def lower(Z):
  return (Z - 1) // Q * Q + 1

def upper(Z):
  return min(int(ceil(X / Y)), ((Z - 1) // Q + 1) * Q)
Run Code Online (Sandbox Code Playgroud)

// 是整数除法。