somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
saya mengharapkan
["some","thing","another","thing"]
ruby
arrays
multidimensional-array
ncvncvn
sumber
sumber
ri Array@flatten!
Mengapa pertanyaan ini mendapatkan begitu banyak suara? Doc secara eksplisitArray#flatten!
Ratakan diri di tempat. Mengembalikan nil jika tidak ada modifikasi yang dilakukan (yaitu, array tidak mengandung subarrays.)flatten!
tidak berfungsi seperti itu. Akhirnya, pertanyaan tersebut mencerminkan masalah logika daripada masalah optimisasi. Lihat jawaban pilcrow di bawah ini untuk informasi lebih lanjut.Jawaban:
Anda punya ide yang bisa diterapkan, tetapi
#flatten!
ada di tempat yang salah - itu meratakan penerima, sehingga Anda bisa menggunakannya untuk berubah[1, 2, ['foo', 'bar']]
menjadi[1,2,'foo','bar']
.Saya pasti lupa beberapa pendekatan, tetapi Anda dapat menggabungkan :
atau tambahkan / tambahkan :
atau sambatan :
atau tambahkan dan ratakan :
sumber
Array#concat
tidak mengalokasikan array baru, Concatenation withArray#+
doesAnda cukup menggunakan
+
operator!Anda dapat membaca semua tentang kelas array di sini: http://ruby-doc.org/core/classes/Array.html
sumber
a+= b
membuat larik baru:c = a = [1,2] ; b = [3,4] ; a += b ; puts c #=> [1,2]
push
metode seperti yang dijelaskan oleh @pilcrow.+=
menciptakan objek baru. dalam contoh seperti[1, 2].each_with_object([]) { |number, object| object+=number }
array kosong[]
akan dikembalikanPendekatan terbersih adalah dengan menggunakan metode # array concat ; 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 ):
Begitu
Array # concat tidak akan meratakan array multidimensi jika dilewatkan sebagai argumen. Anda harus menanganinya secara terpisah:
Terakhir, Anda dapat menggunakan permata corelib kami ( https://github.com/corlewsolutions/corelib ) yang menambahkan pembantu yang berguna ke kelas inti Ruby. Secara khusus kami memiliki metode # add_all Array yang akan secara otomatis meratakan array multidimensi sebelum menjalankan concat.
sumber
Metode mudah yang berfungsi dengan versi Ruby> = 2.0 tetapi tidak dengan versi yang lebih lama:
sumber
*
sini?[*a, *b]
gagal untuk ruby versi lama, yaitu 1.8.7. Dan sebanyak yang ingin disampaikan Ruby kepada Anda tentang kehidupannya, RHEL6 tetap dipertahankan, menjadikan Ruby 1.8 sebagai versi target yang sangat signifikan.[...array1, ...array2]
, hanya mengingat bahwasplat
operator di ruby akan menjadi*
pengganti...
. Itu membuatnya lebih mudah untuk diingatCoba ini, ini akan menggabungkan array Anda menghapus duplikat
http://www.ruby-doc.org/core/classes/Array.html
Dokumentasi lebih lanjut lihat "Set Union"
sumber
array1 |= [ "foo1", "bar1" ] #=> [ "foo", "bar", "foo1", "bar1" ]
Berikut adalah dua cara, perhatikan dalam hal ini bahwa cara pertama menetapkan array baru (diterjemahkan ke somearray = somearray + anotherarray)
sumber
Untuk menambahkan
b
kea
dan menyimpan hasilnya dalama
:atau
Dalam kedua kasus,
a
menjadi:tetapi dalam kasus sebelumnya, unsur-unsur
b
ditambahkan kea
array yang ada , dan dalam kasus yang kedua dua array digabungkan bersama-sama dan hasilnya disimpan dia
.sumber
a.push(*b)
tidak persis sama dengana += b
. Yang pertama menambahkan elemen baru ke array yang ada; yang terakhir membuat array baru dengan semua elemen dan menugaskannyaa
. Anda dapat melihat perbedaannya jika Anda melakukan sesuatu sepertiaa = a
menyimpan refa
sebelum sebelum menambahkan metode dan kemudian memeriksanyaaa
. Dalam kasus yang pertama, itu berubah dengan nilai barua
, dan yang terakhir itu tetap tidak berubah.(array1 + array2).uniq
Dengan cara ini Anda mendapatkan elemen array1 terlebih dahulu. Anda tidak akan mendapatkan duplikat.
sumber
Menguraikan jawaban @ Pilcrow satu-satunya jawaban yang cocok untuk array besar adalah
concat
(+
) karena cepat dan tidak mengalokasikan objek baru untuk pengumpulan sampah saat beroperasi di dalam sebuah loop.Inilah patokannya:
Hasil:
Seperti yang Anda lihat menggunakan
push
throws ERROR :stack level too deep (SystemStackError)
ketika array cukup besar.sumber
Pertanyaannya, pada dasarnya, adalah "bagaimana menggabungkan array di Ruby". Secara alami jawabannya adalah menggunakan
concat
atau+
seperti yang disebutkan dalam hampir setiap jawaban.Sebuah ekstensi alami untuk pertanyaan adalah "bagaimana melakukan penggabungan baris 2D dari array 2D di Ruby". Ketika saya googled "ruby concatenate matrices", pertanyaan SO ini adalah hasil teratas jadi saya pikir saya akan meninggalkan jawaban saya untuk pertanyaan (tanpa diminta tetapi terkait) di sini untuk anak cucu.
Dalam beberapa aplikasi Anda mungkin ingin "menggabungkan" dua array 2D bijaksana. Sesuatu seperti,
Ini adalah sesuatu seperti "menambah" sebuah matriks. Sebagai contoh, saya menggunakan teknik ini untuk membuat matriks adjacency tunggal untuk mewakili grafik dari sekelompok matriks yang lebih kecil. Tanpa teknik ini saya harus beralih pada komponen dengan cara yang bisa menjadi rawan kesalahan atau frustasi untuk dipikirkan. Saya mungkin harus melakukan
each_with_index
, misalnya. Sebagai gantinya saya menggabungkan zip dan meratakan sebagai berikut,sumber
Hanya cara lain untuk melakukannya.
sumber
flatten
meratakan segalanya sejauh mungkin, secara rekursif. Bahkan array bersarang. Akibatnya, jikasomearray
atauanotherarray
mengandung array bersarang, mereka juga diratakan. Ini adalah efek samping yang biasanya tidak dimaksudkan.["some", "thing"] + ["another" + "thing"]
sumber
[*a] + [*b]
bekerja"another" + "thing"
akan berfungsi seperti yang diharapkan.Jika data baru bisa berupa array atau skalar, dan Anda ingin mencegah data baru untuk bersarang jika itu adalah array, operator percikan mengagumkan! Ini mengembalikan skalar untuk skalar, dan daftar argumen untuk array.
sumber
Saya terkejut tidak ada yang disebutkan
reduce
, yang bekerja dengan baik ketika Anda memiliki array array:sumber
Ini tidak akan menghapus dups, tetapi
menghapus dups.
sumber
Saya merasa lebih mudah untuk mendorong atau menambahkan array dan kemudian meratakannya di tempat, seperti:
sumber
somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray + anotherarray
sumber