2010-01-19 12 views
3

Je ne peux pas obtenir l'index d'entrée de table. J'en ai besoin pour enlever un objet de la table. J'utilise table.insert pour ajouter des entrées à la table.Obtenir l'index d'entrée de table

Une autre question: pourquoi Lua n'a pas de "surcharge" à la fonction table.remove, donc on peut supprimer un élément par index associatif?

Répondre

1

t[k]=nil supprime de t l'entrée avec la clé k. Pour la deuxième question, la réponse est que les tables peuvent avoir des métatables individuelles.

+0

Oui, mais pourquoi n'existe-t-il pas d'IndexOf tel qu'il est en C# ou en Java? – mnn

7

Les tables implémentent une relation non ordonnée un à plusieurs entre les clés et les valeurs. En d'autres termes, une clé particulière (index) ne peut apparaître qu'une seule fois dans une table, mais une valeur peut apparaître plusieurs fois. Si vous connaissez la clé k, alors t[k] = nil supprimera à la fois la clé et la valeur associée de la table. Cependant, cette opération n'a aucun effet sur les autres clés ou valeurs de la table.

Les fonctions table.insert et table.remove fonctionnent sur l'ensemble des clés entières séquentielles commençant à 1, qui sont utilisées par convention pour implémenter des tableaux ou des listes. Pour ce faire, ils manipulent d'autres valeurs dans la liste afin d'éviter que la liste ne développe des trous. Une façon de trouver une clé à laquelle une valeur est trouvée est de simplement faire une recherche dans la table. Si cela doit être fait plus d'une fois, alors il est probablement une bonne idée de construire une deuxième table qui inverse les paires clé/valeur afin que la recherche par valeur soit aussi rapide que la recherche par index.

Une implémentation appropriée dépendra de vos hypothèses et de vos besoins. Certains exemples sont:

-- return the first integer index holding the value 
function AnIndexOf(t,val) 
    for k,v in ipairs(t) do 
     if v == val then return k end 
    end 
end 

-- return any key holding the value 
function AKeyOf(t,val) 
    for k,v in pairs(t) do 
     if v == val then return k end 
    end 
end 

-- return all keys holding the value 
function AllKeysOf(t,val) 
    local s={} 
    for k,v in pairs(t) do 
     if v == val then s[#s+1] = k end 
    end 
    return s 
end 

-- invert a table so that each value is the key holding one key to that value 
-- in the original table. 
function Invert(t) 
    local i={} 
    for k,v in pairs(t) do 
     i[v] = k 
    end 
    return i 
end 
+0

merci. Il y a d'autres explications de l'approche d'inversion clé/valeur sur SO, mais la vôtre est la seule qui m'a aidé à "l'obtenir". Bien joué. –