Gibt es eine Methode, um zu überprüfen, ob eine Tabelle einen Wert enthält? Ich habe meine eigene (naive) Funktion, aber ich habe mich gefragt, ob es dafür etwas "Offizielles" gibt. Oder etwas effizienteres ...
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
Der Hauptgrund, warum ich diese Funktionen verwende, ist übrigens, Tabellen als Mengen zu verwenden, dh ohne doppelte Elemente. Gibt es noch etwas, das ich gebrauchen könnte?
_
.pairs()
gibt zurückkey, value
, aber in diesem Beispiel brauche ich nur den Wert. Es ist eine Art Konvention (übernommen im Buch "Programming in Lua" lua.org/pil/index.html ), diese_
Variable zum Speichern von Dingen zu verwenden, die Sie nicht benötigen._
die auch in Python und JavaScript verwendet werden.Antworten:
Sie können die Werte als Schlüssel für die Tabelle festlegen. Beispielsweise:
Es gibt ein voll funktionsfähiges Beispiel hier .
quelle
function keysOfSet(set) local ret={} for k,_ in pairs(set) do ret[#ret+1]=k end return ret end
In Anbetracht Ihrer Darstellung ist Ihre Funktion so effizient wie möglich. Wie von anderen angemerkt (und in Sprachen, die älter als Lua sind), besteht die Lösung für Ihr eigentliches Problem natürlich darin, die Darstellung zu ändern. Wenn Sie Tabellen haben und Mengen möchten, wandeln Sie Tabellen in Mengen um, indem Sie das Mengenelement als Schlüssel und
true
als Wert verwenden. +1 zu interjay.quelle
Ich kann mir keine andere Möglichkeit vorstellen, Werte zu vergleichen, aber wenn Sie das Element der Menge als Schlüssel verwenden, können Sie den Wert auf etwas anderes als Null setzen. Dann erhalten Sie schnelle Suchvorgänge, ohne die gesamte Tabelle durchsuchen zu müssen.
quelle
Ich weiß, dass dies ein alter Beitrag ist, aber ich wollte etwas für die Nachwelt hinzufügen. Die einfache Möglichkeit, das Problem zu lösen, besteht darin, eine weitere Tabelle mit einem Wert für den Schlüssel zu erstellen.
dh. Sie haben 2 Tabellen mit demselben Wert, von denen eine in eine Richtung und eine in die andere Richtung zeigt.
Anschließend können Sie die neue Tabelle abfragen, um festzustellen, ob sie den Schlüssel 'element' enthält. Dies verhindert, dass jeder Wert der anderen Tabelle durchlaufen werden muss.
Wenn sich herausstellt, dass Sie das 'Element' nicht als Schlüssel verwenden können, weil es beispielsweise keine Zeichenfolge ist, fügen
tostring
Sie beispielsweise eine Prüfsumme hinzu oder verwenden Sie diese als Schlüssel.Warum willst du das tun? Wenn Ihre Tabellen sehr groß sind, ist die Zeit zum Durchlaufen aller Elemente erheblich, sodass Sie dies nicht sehr oft tun können. Der zusätzliche Speicheraufwand ist relativ gering, da 2 Zeiger auf dasselbe Objekt und nicht 2 Kopien desselben Objekts gespeichert werden. Wenn Ihre Tabellen sehr klein sind, ist dies viel weniger wichtig. Tatsächlich kann die Iteration sogar schneller sein als die Suche nach einer anderen Karte.
Der Wortlaut der Frage deutet jedoch stark darauf hin, dass Sie eine große Anzahl von Punkten zu behandeln haben.
quelle