Czy istnieje metoda sprawdzania, czy tabela zawiera wartość? Mam swoją (naiwną) funkcję, ale zastanawiałem się, czy istnieje do tego coś „oficjalnego”? Albo coś bardziej wydajnego ...
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
Nawiasem mówiąc, głównym powodem, dla którego używam tej funkcji, jest używanie tabel jako zestawów, tj. Bez zduplikowanych elementów. Czy jest coś innego, czego mógłbym użyć?
_
.pairs()
zwracakey, value
, ale w tym przykładzie potrzebuję tylko wartości. Jest to rodzaj konwencji (przyjętej w książce „Programming in Lua” lua.org/pil/index.html ), aby używać tej_
zmiennej do przechowywania rzeczy, których nie potrzebujesz._
używaną również w Pythonie i JavaScript.Odpowiedzi:
Możesz umieścić wartości jako klucze tabeli. Na przykład:
Jest bardziej pełni funkcjonalny przykład tutaj .
źródło
function keysOfSet(set) local ret={} for k,_ in pairs(set) do ret[#ret+1]=k end return ret end
Biorąc pod uwagę Twoją reprezentację, Twoja funkcja jest tak wydajna, jak to tylko możliwe. Oczywiście, jak zauważyli inni (i jak jest to praktykowane w językach starszych niż Lua), rozwiązaniem twojego prawdziwego problemu jest zmiana reprezentacji. Jeśli masz tabele i chcesz zestawy, zamieniasz tabele w zestawy, używając elementu set jako klucza i
true
jako wartości. +1 do interjay.źródło
Nie mogę wymyślić innego sposobu porównywania wartości, ale jeśli użyjesz elementu zestawu jako klucza, możesz ustawić wartość na cokolwiek innego niż zero. Dzięki temu uzyskujesz szybkie wyszukiwania bez konieczności przeszukiwania całej tabeli.
źródło
Wiem, że to stary post, ale chciałem dodać coś dla potomności. Prostym sposobem rozwiązania problemu, który masz, jest utworzenie innej tabeli o wartości do klucza.
to znaczy. masz 2 tabele o tej samej wartości, jedna wskazuje w jednym kierunku, a druga w drugą.
Następnie możesz wysłać zapytanie do nowej tabeli, aby sprawdzić, czy zawiera kluczowy „element”. Zapobiega to konieczności iteracji przez każdą wartość w drugiej tabeli.
Jeśli okaże się, że w rzeczywistości nie możesz użyć `` elementu '' jako klucza, ponieważ nie jest to na przykład łańcuch, dodaj sumę kontrolną lub
tostring
na przykład do niej, a następnie użyj tego jako klucza.Dlaczego chcesz to zrobić? Jeśli twoje tabele są bardzo duże, ilość czasu na iterację przez każdy element będzie znacząca, uniemożliwiając ci wykonywanie tego bardzo często. Dodatkowy narzut pamięci będzie stosunkowo niewielki, ponieważ będzie przechowywać 2 wskaźniki do tego samego obiektu, a nie 2 kopie tego samego obiektu. Jeśli twoje tabele są bardzo małe, będzie to miało znacznie mniejsze znaczenie, w rzeczywistości iteracja może być nawet szybsza niż ponowne wyszukiwanie mapy.
Sformułowanie pytania jednak silnie sugeruje, że masz do czynienia z dużą liczbą spraw.
źródło