我正在为自定义谷歌地图控件制作自定义数据寻呼机.控件需要确定要显示的页面范围.例如,如果用户在第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.
开始了:
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)
// 是整数除法。