2008-11-24 4 views
0

J'ai un tableau de quatre éléments à base de 1 que j'ai besoin de parcourir. Pour un index donné dans le tableau, j'ai besoin de travailler sur l'index de l'élément suivant, et l'index de l'élément précédent. Cela semble simple mais le tableau a besoin d'être enveloppé. Ainsi, lorsque vous êtes au début du tableau, l'élément précédent est considéré comme le dernier élément. De même, si vous êtes à la fin du tableau, l'élément suivant est considéré comme le premier élément. Je réalise que cela peut être résolu en utilisant des instructions conditionnelles, mais je me demandais s'il était possible de le faire en utilisant des équations mathématiques. J'ai un qui fonctionne bien pour l'élément suivantMise en forme de l'index précédent et suivant dans un tableau

NextItem = Modulus(CurrentItem, 4) + 1 

(la fonction de module renvoie le reste d'un nombre divisé par un autre).

Quelqu'un at-il des idées sur la façon dont je peux travailler sur l'élément précédent?

+0

Cela ne devrait-il pas être Modulus (CurrentItem + 1, 4)? – schnaader

+0

Non, la formule pour NextItem fonctionne très bien. Modulus (CurrentItem + 1, 4) échoue lorsque CurrentItem est 3. – gilles27

+0

Oui, le tableau est basé sur 1, bien sûr, désolé. – schnaader

Répondre

2

Étant donné que modulo fonctionne toujours mieux sur les plages 0, vous pouvez le transformer en CurrentItem - 1. Ensuite, avec modulo 4, ajouter 3 revient à soustraire 1 mais a l'avantage de ne jamais devenir négatif (certains opérateurs modulo peuvent ne pas aimer les négatifs).

Ensuite, vous ajoutez à nouveau 1 pour revenir à un nombre basé sur 1.

Cela donne:

PrevItem = Modulus(CurrentItem - 1 + 3, 4) + 1 

ou simplifié:

PrevItem = Modulus(CurrentItem + 2, 4) + 1 
0

Il y a deux choses à comprendre, d'une part, et d'autre part, Modulus(-1,n) = n-1Modulus() fonctionnera mieux avec 0 indexation basé. La combinaison de ces deux donne:

NextItem = Modulus((CurrentItem-1)+1, NumberOfItems) + 1 
PrevItem = Modulus((CurrentItem-1)-1, NumberOfItems) + 1 

Pour le cas spécifique de NumberOfItems = 4, Modulus(-2,4) = 2, qui donne la réponse de Pax et peut être nécessaire si Modulus() de votre système ne supporte pas les nombres négatifs, mais ne sont pas aussi claires.

-1

Il pourrait dépend des propriétés de votre Modulus contre des valeurs négatives, mais dans Lua les travaux suivants:

for i = 1, 8 do 
    local idxF = i % 4 + 1 
    local idxB = (i - 2) % 4 + 1 
    print(i .. " " .. idxF .. " " .. idxB) 
end 

devrait être PreviousItem = Modulus(CurrentItem - 2, 4) + 1 dans votre langue non précisée.

Questions connexes