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
Oui, mais pourquoi n'existe-t-il pas d'IndexOf tel qu'il est en C# ou en Java? – mnn