Saya punya kode berikut:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Saya ingin menggabungkan array s
ke dalam array a
yang akan memberi saya:
["Cat", "and", "Dog", "&", "Mouse"]
Melihat melalui Ruby Array dan Enumerable docs, I don't melihat seperti metode yang akan mencapai hal ini.
Apakah ada cara saya bisa melakukan ini tanpa iterasi melalui masing-masing array?
Ini won't memberikan hasil array dalam urutan Chris meminta, tapi jika urutan array yang dihasilkan doesn't peduli, anda hanya dapat menggunakan a |= b
. Jika anda don't ingin bermutasi a
, anda dapat menulis | b
dan menetapkan hasilnya ke variabel.
Melihat ditetapkan uni dokumentasi untuk kelas Array di http://www.ruby-doc.org/core/classes/Array.html#M000275.
Jawaban ini mengasumsikan bahwa anda don't ingin duplikasi elemen array. Jika anda ingin mengizinkan duplikasi elemen terakhir array, a += b
harus melakukan trik. Sekali lagi, jika anda don't ingin bermutasi a
, gunakan a + b
dan menetapkan hasilnya ke variabel.
Dalam menanggapi beberapa komentar di halaman ini, kedua solusi ini akan bekerja dengan array dari setiap ukuran.
Berikut ini's solusi yang memungkinkan interleaving beberapa array dengan ukuran yang berbeda (solusi umum):
arr = [["Cat", "Dog", "Mouse", "boo", "zoo"],
["and", "&"],
["hello", "there", "you"]]
first, *rest = *arr; first.zip(*rest).flatten.compact
=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]
It's tidak persis elegan, tetapi bekerja untuk array ukuran:
>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2]
#=> ["Cat", "and", "Dog", "&", "Mouse"]
Bagaimana dengan yang lebih umum solusi yang bekerja bahkan jika array pertama isn't terpanjang dan menerima setiap jumlah array?
a = [
["and", "&"],
["Cat", "Dog", "Mouse"]
]
b = a.max_by(&:length)
a -= [b]
b.zip(*a).flatten.compact
=> ["Cat", "and", "Dog", "&", "Mouse"]
Salah satu cara untuk melakukan interleave dan juga jaminan yang satu adalah yang terbesar array untuk zip metode, adalah untuk mengisi salah satu dari array dengan nihil
sampai ukuran array. Dengan cara ini, anda juga jaminan yang elemen dari array yang akan berada di posisi pertama:
preferred_arr = ["Cat", "Dog", "Mouse"]
other_arr = ["and","&","are","great","friends"]
preferred_arr << nil while preferred_arr.length < other_arr.length
preferred_arr.zip(other_arr).flatten.compact
#=> ["Cat", "and", "Dog", "&", "Mouse", "are", "great", "friends"]
Untuk menangani situasi di mana kedua a
& s
yang bukan dari ukuran yang sama:
a.zip(s).flatten.compact | s
.kompak
akan menghilangkan nihil
ketika a
lebih besar dari s
| s
akan menambahkan barang-barang yang tersisa dari s
ketika a
lebih kecil dari s