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

时间:2010-02-26 14:57:36

标签: 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。

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

2 个答案:

答案 0 :(得分:9)

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

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

然后第r章的页面在

范围内

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);

要删除if,您现在可以用

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

r = (Z-1)/Q;
Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);

这是因为:

Q r + 1&lt; = Z&lt; = Q (r + 1)当且仅当

Q r&lt; = Z-1&lt; = Q r +(Q-1)。

因此floor((Z-1)/ Q)= r。

答案 1 :(得分:4)

我们走了:

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

def upper(Z):
  return min(int(ceil(X / Y)), ((Z - 1) // Q + 1) * Q)

//是整数除法。