Diberikan:
a1 = [5, 1, 6, 14, 2, 8]
Saya ingin menentukan apakah mengandung semua elemen:
a2 = [2, 6, 15]
Dalam hal ini hasilnya adalah false
.
Apakah ada metode Ruby / Rails bawaan untuk mengidentifikasi penyertaan array seperti itu?
Salah satu cara untuk mengimplementasikan ini adalah:
a2.index{ |x| !a1.include?(x) }.nil?
Apakah ada cara yang lebih baik dan lebih mudah dibaca?
ruby-on-rails
arrays
ruby
Misha Moroshko
sumber
sumber
Jawaban:
sumber
(a2-a1).empty?
(a2.uniq - a1.uniq).empty?
Mungkin ini lebih mudah dibaca:
Anda juga dapat menggunakan persimpangan array:
Catatan yang
size
digunakan di sini hanya untuk kecepatan, Anda juga dapat melakukan (lebih lambat):Tapi saya kira yang pertama lebih mudah dibaca. Ini 3 adalah ruby polos (bukan rel).
sumber
Ini bisa dicapai dengan melakukan
Ini menciptakan persimpangan kedua array, mengembalikan semua elemen
a2
yang juga ada di dalamnyaa1
. Jika hasilnya sama dengana2
, Anda dapat yakin bahwa Anda memiliki semua elemen yang disertakana1
.Pendekatan ini hanya bekerja jika semua elemen di
a2
berbeda satu sama lain di tempat pertama. Jika ada ganda, pendekatan ini gagal. Yang dari Tempos masih berfungsi, jadi saya dengan sepenuh hati merekomendasikan pendekatannya (juga mungkin lebih cepat).sumber
length
metode ini akan jauh lebih baikJika tidak ada elemen duplikat atau Anda tidak peduli tentang mereka, maka Anda bisa menggunakan kelas Set :
Di balik layar ini menggunakan
sumber
Anda dapat menambal kelas Array:
uji
Tentu saja metode ini dapat ditulis sebagai metode standar saja, mis
dan Anda bisa memintanya seperti
Memang, setelah profil, versi berikut ini jauh lebih cepat, dan kodenya lebih pendek.
sumber
Bergantung pada seberapa besar array Anda, Anda mungkin mempertimbangkan algoritma yang efisien O (n log n)
Mengurutkan biaya O (n log n) dan memeriksa setiap pasangan biaya O (n) sehingga algoritma ini adalah O (n log n). Algoritme lain tidak dapat lebih cepat (asimtotik) menggunakan array yang tidak disortir.
sumber
Sebagian besar jawaban berdasarkan (a1 - a2) atau (a1 & a2) tidak akan berfungsi jika ada elemen duplikat dalam array. Saya tiba di sini mencari cara untuk melihat apakah semua huruf dari kata (dibagi menjadi array) adalah bagian dari serangkaian huruf (misalnya untuk scrabble). Tidak satu pun dari jawaban ini yang berfungsi, tetapi jawaban ini berfungsi:
sumber