Apakah ada metode untuk memeriksa apakah tabel berisi nilai? Saya memiliki fungsi (naif) saya sendiri, tetapi saya bertanya-tanya apakah ada sesuatu yang "resmi" untuk itu? Atau sesuatu yang lebih efisien ...
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
Ngomong-ngomong, alasan utama saya menggunakan fungsi ini adalah menggunakan tabel sebagai set, yaitu tanpa elemen duplikat. Apakah ada hal lain yang bisa saya gunakan?
_
.pairs()
kembalikey, value
, tetapi dalam contoh ini saya hanya membutuhkan nilainya. Ini adalah semacam konvensi (diadopsi dalam buku "Pemrograman dalam Lua" lua.org/pil/index.html ) untuk menggunakan_
variabel ini untuk menyimpan hal-hal yang tidak Anda perlukan._
digunakan dalam Python dan JavaScript, juga.Jawaban:
Anda dapat menempatkan nilai sebagai kunci tabel. Sebagai contoh:
Ada contoh yang lebih lengkap sini .
sumber
function keysOfSet(set) local ret={} for k,_ in pairs(set) do ret[#ret+1]=k end return ret end
Mengingat representasi Anda, fungsi Anda seefisien yang bisa dilakukan. Tentu saja, seperti yang dicatat oleh orang lain (dan seperti yang dipraktikkan dalam bahasa yang lebih tua dari Lua), solusi untuk masalah Anda yang sebenarnya adalah mengubah representasi. Saat Anda memiliki tabel dan menginginkan set, Anda mengubah tabel menjadi set dengan menggunakan elemen set sebagai kunci dan
true
sebagai nilainya. 1 untuk interjay.sumber
Saya tidak dapat memikirkan cara lain untuk membandingkan nilai, tetapi jika Anda menggunakan elemen set sebagai kuncinya, Anda dapat menyetel nilainya ke selain nol. Kemudian Anda mendapatkan pencarian cepat tanpa harus mencari di seluruh tabel.
sumber
Saya tahu ini adalah posting lama, tetapi saya ingin menambahkan sesuatu untuk anak cucu. Cara sederhana untuk menangani masalah yang Anda hadapi adalah dengan membuat tabel lain, dari nilai ke kunci.
yaitu. Anda memiliki 2 tabel yang memiliki nilai yang sama, satu menunjuk satu arah, satu menunjuk ke arah lain.
Anda kemudian dapat meminta tabel baru untuk melihat apakah tabel tersebut memiliki 'elemen' kunci. Ini mencegah kebutuhan untuk mengulangi setiap nilai dari tabel lainnya.
Jika ternyata Anda tidak dapat benar-benar menggunakan 'elemen' sebagai kunci, karena itu bukan string misalnya, tambahkan checksum atau
tostring
di atasnya misalnya, lalu gunakan itu sebagai kuncinya.Mengapa Anda ingin melakukan ini? Jika tabel Anda sangat besar, jumlah waktu untuk mengulangi setiap elemen akan signifikan, sehingga Anda tidak dapat melakukannya terlalu sering. Overhead memori tambahan akan relatif kecil, karena akan menyimpan 2 penunjuk ke objek yang sama, bukan 2 salinan dari objek yang sama. Jika tabel Anda sangat kecil, maka itu tidak akan menjadi masalah, bahkan mungkin lebih cepat untuk mengulang daripada mencari peta lain.
Namun kata-kata dalam pertanyaan tersebut sangat menyarankan bahwa Anda memiliki banyak item untuk ditangani.
sumber