2010-01-20 11 views
4

Je ne sais pas comment gérer nils ma fonction de tri obtient.Traitement de la fonction de tri nils

Lorsque j'ai cette vérification, table.sort se bloque après certains appels.

if a == nil then 
    return false 
elseif b == nil then 
    return true 
end 

Avec cette erreur: fonction de commande non valide pour le tri. Mais selon la documentation, la fonction de tri devrait renvoyer false, si un va après b. Vrai autrement.

Si je supprime supprimer ce code, il se bloque bien sûr des nils d'indexation.

+0

Vous devriez poster plus de code. Obtenir nils dans votre fonction de comparaison est louche. Êtes-vous sûr que le problème est là et pas quelque part autour? – sbk

Répondre

12

Cela a peu ou rien à voir avec nil valeurs dans le tableau. Le message d'erreur est généré si la fonction de comparaison elle-même est invalide. De la documentation table.sort:

If comp is given, then it must be a function that receives two table elements, and returns true when the first is less than the second (so that not comp(a[i+1],a[i]) will be true after the sort).

En d'autres termes, comp(a,b) doit impliquer not comp(b,a). Si cette relation ne tient pas, alors l'erreur "fonction d'ordre invalide pour le tri" sera probablement augmentée. (Notez qu'il peut ne pas être soulevé dans tous les cas.)

Afin d'être plus utile, nous avons vraiment besoin de voir la fonction entière passée à table.sort.

+0

+1: après avoir testé le code de la question, il gère correctement les valeurs nulles dans un tableau. Le problème doit être une incohérence dans le reste de la fonction. – gwell

+5

Il faut souligner que "comp (a, b) ->! Comp (b, a)" contient et "comp (a, b) ==! Comp (b, a)" ne le fait pas; comme dans le cas de a == b, où la fonction retournerait false pour les deux appels à comp(). – RJFalconer

2

Pour mettre toutes les valeurs nulles au début du tableau:

function mycomp(a,b) 
    if a == nil and b == nil then 
     return false 
    end 
    if a == nil then 
     return true 
    end 
    if b == nil then 
     return false 
    end 
    return a < b 
    end 

Pour mettre toutes les valeurs nulles à la fin du tableau:

function mycomp(a,b) 
    if a == nil and b == nil then 
    return false 
    end 
    if a == nil then 
    return false 
    end 
    if b == nil then 
    return true 
    end 
    return a < b 
end 
+0

Désolé, je suppose que je ne me suis pas bien expliqué: D'abord, IL N'Y A PAS DE NUL DANS TABLE. Deuxièmement, table.sort ne veut pas avoir autant de conditions là-bas, parce que quand je supprime nil, ça continue, mais ça tombe en panne. – mnn

Questions connexes