Saya memiliki kode berikut:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Saya ingin menggabungkan array s
menjadi array a
yang akan memberi saya:
["Cat", "and", "Dog", "&", "Mouse"]
Melihat melalui Ruby Array dan dokumen Enumerable, saya tidak melihat metode seperti itu yang akan mencapai ini.
Apakah ada cara agar saya dapat melakukan ini tanpa melakukan iterasi melalui setiap array?
Jawaban:
Anda dapat melakukannya dengan:
sumber
a
memiliki lebih dari 3 elemen?[a, s].transpose
kecuali bahwa dua baris tidak sesuai, meninggalkan#zip
sebagai solusi yang jelas. Dan saya tidak percaya maksudnya bahwa dia benar-benar peduli apakaha
bermutasi ... Saya tidak berpikir dia mengomentari solusi mutasi vs fungsional sama sekali, dia hanya mencoba mendeskripsikan polanya.Ini tidak akan memberikan larik hasil dalam urutan yang diminta Chris, tetapi jika urutan larik yang dihasilkan tidak penting, Anda bisa menggunakan saja
a |= b
. Jika Anda tidak ingin bermutasia
, Anda dapat menulisa | b
dan menetapkan hasilnya ke variabel.Lihat dokumentasi set union untuk kelas Array di http://www.ruby-doc.org/core/classes/Array.html#M000275 .
Jawaban ini mengasumsikan bahwa Anda tidak menginginkan elemen array duplikat. Jika Anda ingin mengizinkan elemen duplikat dalam larik terakhir Anda,
a += b
lakukan triknya. Sekali lagi, jika Anda tidak ingin bermutasia
, gunakana + b
dan tetapkan hasilnya ke variabel.Menanggapi beberapa komentar di halaman ini, kedua solusi ini akan bekerja dengan array dalam berbagai ukuran.
sumber
["Cat", "Dog", "Mouse", "and", "&"]
, yang bukan diinginkan OP.Jika Anda tidak ingin duplikat, mengapa tidak menggunakan operator union :
sumber
s
akan berada di akhir larik baru.Itu tidak memberi Anda pesanan yang Anda minta, tetapi itu cara yang bagus untuk menggabungkan dua larik dengan menambahkan ke satu.
sumber
Berikut adalah solusi yang memungkinkan interleaving beberapa array dengan ukuran berbeda (solusi umum):
sumber
Ini tidak terlalu elegan, tetapi berfungsi untuk array dengan ukuran berapa pun:
sumber
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]
akan sama validnya.and
dan&
, jadi saya menganggapnya sesingkat mungkin, sambil membiarkannyaa
berapa lama.Bagaimana dengan solusi yang lebih umum yang berfungsi bahkan jika array pertama bukan yang terpanjang dan menerima sejumlah array?
sumber
Untuk menangani situasi di mana
a
&s
tidak memiliki ukuran yang sama:.compact
akan dihapusnil
bilaa
lebih besar daris
| s
akan menambahkan item yang tersisa daris
saata
lebih kecil daris
sumber
Salah satu cara untuk melakukan interleave dan juga menjamin array mana yang terbesar untuk metode zip, adalah dengan mengisi salah satu array
nil
hingga ukuran array lainnya. Dengan cara ini, Anda juga menjamin elemen mana dari array mana yang akan berada di posisi pertama:sumber
preferred_arr.zip(other_arr).flatten | other_arr
(tanpa pengisian ulang nihil)sumber