2011-03-09 2 views
4

Je me donne un coup de pied pour avoir à demander cela ... Je peux résoudre cela avec quelques simples «if», mais je suis sûr est un moyen plus simple!Déterminer si un nombre est un plus grand ou un moins qu'un autre dans un ensemble circulaire

J'ai un contrôle de pagination qui permet à l'utilisateur de déplacer une page à gauche ou une page à droite. Chaque page a un index. Le cycle de pages, donc si vous avez trois pages et vous continuez à déplacer à droite l'utilisateur voit:

0 => 1 => 2 => 0 => 1 ... 

J'ai l'index de la page courante et l'index page précédente. Comment puis-je déterminer si l'utilisateur a paginé à droite ou à gauche?

Merci!

Répondre

3

Il n'y a pas assez d'informations pour répondre à la question; il n'est pas toujours possible de dire si l'utilisateur a bougé "à droite" ou "à gauche" avec seulement les indices actuels et antérieurs. Par exemple, disons current = 0 et previous = 1.

L'utilisateur s'est-il déplacé à gauche ou l'utilisateur s'est-il déplacé à droite et il y a eu un débordement vers 0 car il n'y a que deux pages? Ce n'est pas possible de dire.

Si vous ne connaissez pas le nombre de pages, voici quelques solutions approximatives:

// Doesn't handle wrap arounds properly. 
bool movedRight = current == previous + 1; 

// Assumes that being at the start point always means an overflow occurred.  
bool movedRight = (current == previous + 1) || current == 0; 

// Assumes that being at the start point always means an overflow occurred, 
// except when we were previously at the second element. 
bool movedRight = (current == previous + 1) || (current == 0 && previous != 1); 

Si vous connaissez le nombre de pages, il est probablement plus intuitif à faire:

// Can't disambiguate when numPages == 1 or 2 
bool movedRight = current == (previous + 1) % numPages; 

mais encore n'est pas assez d'informations pour dire ce que l'utilisateur a fait quand il y a seulement une ou deux pages: dans ces cas, se déplacer à gauche et à droite produisent des "résultats" équivalents. Si vous devez différencier gauche et droite même dans ces situations, la solution évidente serait simplement de stocker la direction dans laquelle l'utilisateur paginait séparément. Vous ne devriez probablement pas essayer de calculer quelque chose qui ne peut pas être calculé. :)

+0

Vous faites un très bon point! Je gravitais vers le booléen logicRight = current == (previous + 1)% numPages; mais avait manqué sur le numéro de deux pages. Merci beaucoup! – ColinE

-1
bool movedRight = current > previous; 
+0

Ne supporte pas le courant étant 0 et le précédent étant 2. – bleeeah

+0

@bleeeah Je n'ai pas bien lu la question **** slaps front **** –

0
dir = (current == (previous + 1) % num_pages ) ? right : left 
0

Un if devrait être suffisant:

if(prev + 1 == current || (current == 0 && prev > 1)) 
    // right 
else 
    // left 

Si les pages pédalé, la deuxième série de conditions entre en jeu.

+0

Celui qui m'a rejeté: S'il vous plaît commenter pourquoi. –

Questions connexes