Lebih
Bagaimana anda tambahkan array ke array lain di Ruby dan tidak berakhir dengan multi-dimensi hasilnya?
somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
Saya harapkan
["some","thing","another","thing"]
448
17
Anda've punya ide yang bisa diterapkan, tapi
#meratakan!
adalah di tempat yang salah-itu merata penerima, sehingga anda bisa menggunakannya untuk mengubah[1, 2, ['foo', 'bar']]
menjadi[1,2,'foo','bar']
.I'm pasti melupakan beberapa pendekatan, tetapi anda dapat menggabungkan:
atau tambahkan/append:
atau sambatan:
atau append dan meratakan:
Anda hanya dapat menggunakan
+
operator!Anda dapat membaca semua tentang kelas array berikut: http://ruby-doc.org/core/classes/Array.html
Terbersih pendekatan adalah dengan menggunakan Array#concat metode; itu tidak akan membuat array baru (tidak seperti Array#+ yang akan melakukan hal yang sama tetapi membuat array baru).
Langsung dari dokumen (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat):
Jadi
Array#concat tidak akan meratakan sebuah array multidimensi jika dilewatkan sebagai argumen. Anda'll perlu menangani secara terpisah:
Terakhir, anda dapat menggunakan kami corelib permata (https://github.com/corlewsolutions/corelib) yang menambahkan pembantu yang berguna untuk Ruby kelas inti. Khususnya kita memiliki Array#add_all metode yang secara otomatis akan meratakan array multidimensi sebelum melaksanakan concat.
Mencoba ini, itu akan menggabungkan array anda menghapus duplikat
http://www.ruby-doc.org/core/classes/Array.html
Dokumentasi lebih lanjut lihat "Uni"
Mudah metode yang bekerja dengan versi Ruby >= 2.0 tapi tidak dengan versi yang lebih tua :
Berikut adalah dua cara, perilaku dalam hal ini yang pertama dengan cara memberikan sebuah array baru ( diterjemahkan ke somearray = somearray + anotherarray )
(array1 + array2).uniq
Dengan cara ini anda mendapatkan array1 elemen pertama. Anda akan mendapatkan tidak ada duplikat.
Untuk menambahkan
b
untuka
dan menyimpan hasilnya dalama
:atau
Dalam kedua kasus,
a
menjadi:tapi dalam kasus yang pertama, unsur-unsur
b
yang ditambahkan ke yang adaa
array, dan dalam kasus terakhir dua array yang digabungkan bersama-sama dan hasilnya disimpan dalama
.Mengelaborasi @Pilcrow's jawaban yang hanya cocok untuk menjawab besar array adalah
concat
(+
) karena lebih cepat dan tidak mengalokasikan objek baru yang akan mengumpulkan sampah ketika beroperasi di dalam lingkaran.Berikut ini's benchmark:
Hasil:
Seperti yang anda lihat menggunakan
push
melempar ERROR:stack tingkat terlalu dalam (SystemStackError)
ketika array yang cukup besar.Hanya cara lain untuk melakukan hal itu.
Pertanyaannya, pada dasarnya, adalah "bagaimana untuk menggabungkan array di Ruby". Tentu jawabannya adalah dengan menggunakan
concat
atau+
seperti yang disebutkan di hampir setiap jawaban.Perpanjangan alami untuk pertanyaan akan menjadi "bagaimana untuk melakukan row-wise rangkaian dari 2D array di Ruby". Ketika saya mencari di google "ruby menggabungkan matriks", ini JADI pertanyaan adalah hasil atas jadi saya pikir saya akan meninggalkan jawaban saya untuk pertanyaan itu (tanpa diminta, tetapi terkait) pertanyaan berikut ini untuk anak cucu.
Dalam beberapa aplikasi, anda mungkin ingin "menggabungkan" dua array 2D row-wise. Sesuatu seperti,
Ini adalah sesuatu seperti "menambah" matriks. Untuk contoh, saya menggunakan teknik ini untuk membuat satu adjacency matrix untuk mewakili grafik dari sekelompok kecil matrik. Tanpa teknik ini saya akan memiliki untuk iterate atas komponen-komponen dalam sebuah cara yang bisa saja rawan kesalahan atau frustasi untuk berpikir tentang. Saya mungkin harus melakukan
each_with_index
, misalnya. Bukannya aku dikombinasikan zip dan meratakan sebagai berikut,Jika data baru yang bisa menjadi sebuah array atau skalar, dan anda ingin mencegah data baru untuk bersarang jika itu array, splat operator adalah awesome! Kembali skalar untuk suatu skalar, dan membongkar daftar argumen untuk sebuah array.
["c", "sesuatu"] + ["lain" + "sesuatu"]
I'm heran tidak ada yang menyebutkan
mengurangi
, yang bekerja dengan baik ketika anda memiliki sebuah array dari array:Ini won't menghapus dups, tapi
menghilangkan dups.
Saya merasa lebih mudah untuk mendorong atau menambahkan array dan kemudian meratakan mereka di tempat, seperti:
somearray = ["c", "sesuatu"]
anotherarray = ["lain", "sesuatu"]
somearray + anotherarray