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

3
我正在为自定义的谷歌地图控件工作,制作自定义数据分页器。该控件需要确定要显示哪些页面范围。例如,如果用户在第6页,则控件必须显示第1页到第10页。如果用户在第37页,则控件必须显示第30页到第40页。
我可以使用以下变量:
X - 总结果数(地图上的点); Y - 当前页面大小,即每页的点数; Z - 当前显示的页面; Q - 要显示的页面数(常量为10)。
我已经想出了以下公式:
起始索引 = Z - (Z % Q); 结束索引 = Z - (Z % Q) + Q。
然而,这个公式对于当前页面小于10的情况不适用。它也无法确定是否达到了最大页面,即我们总是显示一个完整的10页范围。但是,如果我们显示30-40的范围,最终页面可能实际上是38。
如果有人能想出更优雅的算法,将不胜感激。

1
如果您需要显示第20页,应该是10-20还是20-30呢? - Aryabhatta
抱歉,这应该是11-20,21-30等。 - Ryan Tomlinson
2个回答

8

如果你按照章节来考虑,可能会更容易。

每一组页面都是一个章节,章节编号从0、1、2...开始。

那么第r个章节的页面范围为

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

现在考虑floor(page/Q)。如果page不是Q的倍数,则r等于floor(page/Q),否则r等于floor(page/Q) + 1。

给定r,你可以找到该章节的页面范围,即Lower = Qr + 1和higher = 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);

这个方法可行的原因是:

当且仅当Qr + 1 <= Z <= Q(r+1)时,才成立。

因此,Qr <= Z-1 <= Qr + (Q-1)。

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


@Ryan:Z/Q = 整数除法,对于正整数来说,它与向下取整相同。使用你所用的编程语言提供的方法即可。另外,我已经去掉了if语句,请看看是否适用。 - Aryabhatta
非常感谢,我正在使用服务器端排序的结果集分页。我正在寻找一种算法来查找与给定搜索条件匹配的任何记录的页码。已排序。 - doright

5

好的,开始了:

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

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

// 是整数除法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接