2010-02-26 73 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