Trattare nils in funzione di ordinamento
Domanda
Non so come gestire nils
mia funzione di ordinamento ottiene.
Quando ho questo controllo in esso, si blocca table.sort
dopo alcune chiamate.
if a == nil then
return false
elseif b == nil then
return true
end
Con questo errore: Funzione ordine non valido per l'ordinamento . Ma secondo la documentazione, sorta funzione dovrebbe restituire false, se una va dopo b. È vero il contrario.
Se rimuovo rimuovere quel codice, naturalmente crash di Nils indicizzazione.
Soluzione
Questo ha poco o nulla a che fare con i valori nil
nella tabella. Il messaggio di errore viene generato se la funzione di confronto in sé non è valido. Dalla documentazione per table.sort
:
Se viene dato
comp
, allora deve essere un funzione che riceve due tabella elementi, e restituisce vero quando il primo è minore del secondo (in modo chenot comp(a[i+1],a[i])
sarà vero dopo l'ordinamento).
In altre parole, comp(a,b)
deve implicare not comp(b,a)
. Se questo rapporto non regge, allora l'errore "funzione di ordine non valido per l'ordinamento" sarà probabilmente sollevata. (Si noti che non potrebbe essere sollevato in tutti i casi).
Al fine di essere più disponibile, abbiamo davvero bisogno di vedere l'intera funzione passata a table.sort
.
Altri suggerimenti
Per mettere tutti i valori nulli all'inizio della matrice:
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
Per mettere tutti i valori zero alla fine della matrice:
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