2010-02-26 7 views
3

Je travaille sur un pager de données personnalisé pour un contrôle google maps personnalisé. Le contrôle doit déterminer quelle plage de pages afficher. Par exemple, si l'utilisateur se trouve à la page 6, le contrôle doit afficher les pages 1 à 10. Si l'utilisateur est à la page 37, le contrôle doit afficher les pages 30 à 40.Algorithme de pagination personnalisé pour calculer les pages à afficher

Les variables dont je dispose sont :

X - total des résultats (points sur la carte)
Y - la taille de la page en cours. c'est-à-dire le nombre de points par page.
Z - La page actuelle affichée
Q - Le nombre de numéros de page pour afficher (const de 10)

Je suis venu avec:

Démarrage Index = Z - (Z% Q)
Index Mettre fin à = Z - (Z% Q) + Q

Ceci, cependant, ne fonctionne pas lorsque la page en cours est inférieur à 10. Il a également ne comprend pas si une page maximum est atteinte, c'est-à-dire que nous affichons toujours une plage complète de 10. Cependant, si nous affichons la plage 30-40, la dernière page pourrait être 38.

Si quelqu'un peut venir avec un algorithme plus élégant, il serait appre cité.

+1

Et si vous deviez afficher la page 20? Serait-ce 10-20 ou 20-30? –

+0

Excuses cela devrait être 11-20, 21-30 etc. –

Répondre

8

Cela pourrait être plus facile si vous pensez en termes de chapitres.

dire que chaque ensemble de pages est un chapitre, chapitre sont numérotés à partir de 0, 1, 2, ...

Ensuite, le chapitre rth a des pages dans la gamme

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

Considérez maintenant le plancher (page/Q). C'est r si page n'est pas un multiple de Q, sinon c'est r + 1.

Étant donné un r, vous pouvez trouver les pages du chapitre comme inférieur = Q r + 1 et plus haut = min (max, Q (r + 1)).

Donc, vous pouvez le faire.

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

Pour se débarrasser des si, vous pouvez le remplacer par

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

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

Cela fonctionne parce que:

Q r + 1 < = Z < = Q (r + 1) si et seulement si

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

Ainsi étage ((Z-1)/Q) = r.

+0

devrait Z/Q ne pas être Z // Q? –

+0

@Ryan: Z/Q = division entière, pour les entiers positifs, elle est identique à floor. Utilisez tout ce que votre langue vous donne. Aussi, je me suis débarrassé du si, voyez si cela fonctionne pour vous. –

+0

Merci beaucoup, j'utilise la pagination de jeu de résultats avec le tri côté serveur. Je cherchais un algorithme pour trouver les numéros de page de tout enregistrement correspondant à un critère de recherche donné. Trié. – doright

3

Here we go:

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

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

// est division entière.

+0

Pourquoi, pourquoi n'est-ce pas la réponse acceptée? – Merc

Questions connexes