Tanpa mengulangi seluruh array, bagaimana saya bisa memeriksa apakah x
dalam array menggunakan Go? Apakah bahasa memiliki konstruk?
Seperti Python: if "x" in array: ...
Tanpa mengulangi seluruh array, bagaimana saya bisa memeriksa apakah x
dalam array menggunakan Go? Apakah bahasa memiliki konstruk?
Seperti Python: if "x" in array: ...
strings.Index
) membantu membuatnya lebih jelas apa yang dilakukan kode. Saya mendapat kesan bahwa mungkin Anda berpikir Pythonin array:
melakukan sesuatu dengan cepat / ajaib. AFAIK tidak. Membuat loop yang eksplisit membantu membuat penulis (dan semua pembaca) sadar dan mempertimbangkan implementasi lain (misalnya peta).Jawaban:
Tidak ada operator bawaan untuk melakukannya di Go. Anda perlu beralih di atas array. Anda dapat menulis fungsi Anda sendiri untuk melakukannya, seperti ini:
Jika Anda ingin dapat memeriksa keanggotaan tanpa mengulangi seluruh daftar, Anda perlu menggunakan peta sebagai ganti array atau slice, seperti ini:
sumber
Solusi lain jika daftar berisi nilai-nilai statis.
misalnya: memeriksa nilai yang valid dari daftar nilai yang valid:
sumber
Ini adalah kutipan dari buku "Programming in Go: Membuat Aplikasi untuk Abad 21":
https://play.golang.org/p/UIndYQ8FeW
sumber
n*log(n) + log(n)
, karena ini adalah dua operasi independen yang konsekuenContoh di atas menggunakan pengurutan dekat, tetapi dalam kasus string cukup gunakan SearchString:
https://golang.org/pkg/sort/#SearchStrings
sumber
sort.SearchStrings
.Hanya punya pertanyaan serupa dan memutuskan untuk mencoba beberapa saran di utas ini.
Saya telah membuat tolok ukur skenario kasus terbaik dan terburuk dari 3 jenis pencarian:
ini kode fungsinya:
skenario kasus terbaik memilih item pertama dalam daftar, yang terburuk menggunakan nilai tidak ada.
berikut hasilnya:
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
Alihkan kemenangan, case terburuk jauh lebih cepat daripada case terbaik. Peta adalah yang terburuk dan daftar lebih dekat untuk beralih.
Jadi moralnya adalah: Jika Anda memiliki daftar statis, cukup kecil, pergantian pernyataan adalah cara untuk pergi.
sumber
:
alih - alih,
dalam pernyataan switch? Apakah ini membuatnya lebih cepat?case
pernyataan, bukan satu kasus. Hasilnya masuk akal sama dengan kedua fungsi.Pilihan lain adalah menggunakan peta sebagai set. Anda hanya menggunakan kunci dan memiliki nilai menjadi sesuatu seperti boolean yang selalu benar. Kemudian Anda dapat dengan mudah memeriksa apakah peta tersebut berisi kunci atau tidak. Ini berguna jika Anda membutuhkan perilaku set, di mana jika Anda menambahkan nilai beberapa kali, itu hanya di set sekali.
Berikut adalah contoh sederhana di mana saya menambahkan angka acak sebagai kunci ke peta. Jika nomor yang sama dihasilkan lebih dari satu kali tidak masalah, itu hanya akan muncul di peta akhir satu kali. Lalu saya menggunakan cek sederhana jika untuk melihat apakah kunci ada di peta atau tidak.
Ini dia tempat bermain
sumber
Ini sedekat yang saya bisa rasakan secara alami oleh operator "in" Python. Anda harus menentukan tipe Anda sendiri. Kemudian Anda dapat memperluas fungsionalitas jenis itu dengan menambahkan metode seperti "memiliki" yang berperilaku seperti yang Anda harapkan.
Saya memiliki perpustakaan utilitas di mana saya mendefinisikan beberapa hal umum seperti ini untuk beberapa jenis irisan, seperti yang mengandung bilangan bulat atau struct saya sendiri.
Ya, ini berjalan dalam waktu linier, tapi bukan itu intinya. Intinya adalah untuk bertanya dan mempelajari bahasa umum apa yang Go miliki dan tidak miliki. Ini latihan yang bagus. Apakah jawaban ini konyol atau berguna terserah pembaca.
sumber