2010-02-26 48 views
3

我正在寻找一个自定义数据分页器的自定义谷歌地图控制。控件需要确定要显示的页面范围。例如,如果用户在第6页上,则控件必须显示第1页到第10页。如果用户在第37页上,则控件必须显示第30页到第40页。自定义分页算法来计算页面显示

我可用的变量有:

X - 总成绩(在地图上的点)
Ÿ - 当前页面的大小。即每页的点数。
ž - 当前正在显示
Q - 页码数显示(10常量)

我想出了:

启动索引 = Z - (ZQ
结束索引 = ž - (ŽQ)+ Q

然而,这不适用于当所述当前页面是小于10。它也工作不知道是否有最大页面达到,即我们总是显示10的全部范围。但是,如果我们显示范围30-40,最终页面实际上可能是38.

如果任何人都可以上来用更优雅的算法,它将是appre ciated。

+1

如果您必须显示第20页,该怎么办?会是10-20还是20-30? – 2010-02-26 15:20:08

+0

道歉应该是11-20,21-30等 – 2010-02-26 15:23:26

回答

8

如果按照章节思考,这可能会更容易。

说每个组页面是一章,章从0,1,2,开始编号为...

然后第r个章具有范围页

Q R + 1 < =页< = Q(r + 1)

现在考虑floor(page/Q)。如果页面不是Q的倍数,则为r,否则为r + 1。给定一个r,你可以找到这个章节的页面,作为下= 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 (Z < 1 || Z > max_page) { error;} 

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

这工作代替它,因为:

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

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

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

+0

Z/Q不是Z // Q? – 2010-02-26 15:47:15

+0

@Ryan:Z/Q =整数除法,对于正整数,与floor相同。使用任何你的语言给你。另外,我已经摆脱了,看看是否适合你。 – 2010-02-26 16:04:02

+0

非常感谢,我使用服务器端排序结果集分页。我正在寻找一种算法来查找与给定搜索条件匹配的任何记录的页码。排序。 – doright 2012-06-09 13:13:20

3

这里,我们去:

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

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

//是整数除法。

+0

为什么这不是公认的答案? – Merc 2016-08-10 03:30:06