somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
M-am așteptat
["some","thing","another","thing"]
Te'am funcțional idee, dar #aplatiza!
este în locul greșit ... se aplatizează sale receptor, astfel încât ai putea folosi pentru a transforma[1, 2, ['foo', 'bar']] " în " [1,2,'foo','bar']
.
Am'm, fără îndoială, uitând unele abordări, dar puteți înlănțui:
a1.concat a2
a1 + a2 # creates a new array, as does a1 += a2
sau prefixeaza/adăugare:
a1.push(*a2) # note the asterisk
a2.unshift(*a1) # note the asterisk, and that a2 is the receiver
sau îmbinare:
a1[a1.length, 0] = a2
a1[a1.length..0] = a2
a1.insert(a1.length, *a2)
sau adăugați și aplatiza:
(a1 << a2).flatten! # a call to #flatten instead would return a new array
Puteți folosi doar butonul " + " operator!
irb(main):001:0> a = [1,2]
=> [1, 2]
irb(main):002:0> b = [3,4]
=> [3, 4]
irb(main):003:0> a + b
=> [1, 2, 3, 4]
Puteți citi totul despre clasa matrice aici: http://ruby-doc.org/core/classes/Array.html
Cele mai curate abordare este de a utiliza Matrice#concat metoda; ea nu va crea o nouă matrice (spre deosebire de Matrice#+ care va face același lucru, dar a crea o nouă matrice).
Direct de la google docs (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat):
concat(other_ary)
Adaugă elemente de other_ary la sine.
Deci
[1,2].concat([3,4]) #=> [1,2,3,4]
Matrice#concat nu va aplatiza o matrice multidimensionale dacă este trecut în calitate de argument. Te'll nevoie să se ocupe de asta separat:
arr= [3,[4,5]]
arr= arr.flatten #=> [3,4,5]
[1,2].concat(arr) #=> [1,2,3,4,5]
În cele din urmă, puteți utiliza nostru corelib gem (https://github.com/corlewsolutions/corelib) care se adaugă ajutoare utile la Ruby clase de bază. În special, avem o Matrice#add_all metoda care automat va aplatiza tablouri multidimensionale înainte de a executa concat.
Încercați acest lucru, se va combina matrice eliminarea duplicate
array1 = ["foo", "bar"]
array2 = ["foo1", "bar1"]
array3 = array1|array2
http://www.ruby-doc.org/core/classes/Array.html
Documentație suplimentară uită-te la "Set Uniunii"
Metoda usoara, care funcționează cu Ruby versiunea >= 2.0 dar nu cu versiuni mai vechi :
irb(main):001:0> a=[1,2]
=> [1, 2]
irb(main):003:0> b=[3,4]
=> [3, 4]
irb(main):002:0> c=[5,6]
=> [5, 6]
irb(main):004:0> [*a,*b,*c]
=> [1, 2, 3, 4, 5, 6]
Aici sunt două moduri, observă în acest caz că prima cale atribuie o nouă matrice ( se traduce somearray = somearray + anotherarray )
somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray += anotherarray # => ["some", "thing", "another", "thing"]
somearray = ["some", "thing"]
somearray.concat anotherarray # => ["some", "thing", "another", "thing"]
a = ["some", "thing"]
b = ["another", "thing"]
Pentru a adăuga " b " în " a "și stochează rezultatul în "a":
a.push(*b)
sau
a += b
În orice caz, " a " devine:
["some", "thing", "another", "thing"]
dar, în primul caz, elementele de " b "sunt adăugate la cele existente" o "matrice, și în acest din urmă caz, cele două matrice sunt concatenate împreună, iar rezultatul este stocat în "o".
Elaborarea pe @Pilcrow's a răspunde singurul răspuns adecvat pentru tablouri uriașe este concat
(+
) deoarece este rapid și de a nu aloca un obiect nou pentru a fi gunoi colectate atunci când operează în interiorul unei bucle.
Aici's de referință:
require 'benchmark'
huge_ary_1 = Array.new(1_000_000) { rand(5_000_000..30_000_00) }
huge_ary_2 = Array.new(1_000_000) { rand(35_000_000..55_000_00) }
Benchmark.bm do |bm|
p '-------------------CONCAT ----------------'
bm.report { huge_ary_1.concat(huge_ary_2) }
p '------------------- PUSH ----------------'
bm.report { huge_ary_1.push(*huge_ary_2) }
end
Rezultate:
user system total real
"-------------------CONCAT ----------------"
0.000000 0.000000 0.000000 ( 0.009388)
"------------------- PUSH ----------------"
example/array_concat_vs_push.rb:13:in `block (2 levels) in <main>': stack level too deep (SystemStackError)
După cum puteți vedea, folosind "push", aruncă o **** EROARE: stivă nivel prea adânc (SystemStackError)
când tablouri sunt suficient de mari.
Întrebarea, în esență, este "cum de a înlănțui tablouri în Ruby". Firește, răspunsul este de a utiliza concat " sau " +
după cum sa menționat în aproape fiecare răspuns.
O extensie naturală la intrebarea ar fi "cum de a efectua rând, înțelept concatenare de matrice 2D în Ruby". Când am căutat pe google "ruby înlănțui matrici", această întrebare a fost rezultatul de sus așa că am crezut că mi-ar lăsa răspunsul meu la asta (neinvitat dar înrudite) intrebarea aici pentru posteritate.
În unele aplicații s-ar putea dori pentru a "a înlănțui" două matrice 2D rând, înțelept. Ceva de genul,
[[a, b], | [[x], [[a, b, x],
[c, d]] | [y]] => [c, d, y]]
Acest lucru este ceva de genul "augmentarea" - o matrice. De exemplu, am folosit aceasta tehnica pentru a crea o singură matrice de adiacenta pentru a reprezenta un grafic dintr-o grămadă de mici matrici. Fără această tehnică ar fi trebuit să itera peste componentele într-un mod care ar fi putut fi predispus la erori sau frustrant să te gândești. Poate că am avut de a face o each_with_index
, de exemplu. În schimb, am combinat zip și îndreptați, după cum urmează,
# given two multi-dimensional arrays that you want to concatenate row-wise
m1 = [[:a, :b], [:c, :d]]
m2 = [[:x], [:y]]
m1m2 = m1.zip(m2).map(&:flatten)
# => [[:a, :b, :x], [:c, :d, :y]]
Dacă noile date ar putea fi o matrice sau un scalar, și doriți pentru a preveni noile date să fie imbricate dacă a fost o matrice, bulină operator este minunat! Returnează un scalar pentru un scalar, și o despachetat lista de argumente pentru o matrice.
1.9.3-p551 :020 > a = [1, 2]
=> [1, 2]
1.9.3-p551 :021 > b = [3, 4]
=> [3, 4]
1.9.3-p551 :022 > c = 5
=> 5
1.9.3-p551 :023 > a.object_id
=> 6617020
1.9.3-p551 :024 > a.push *b
=> [1, 2, 3, 4]
1.9.3-p551 :025 > a.object_id
=> 6617020
1.9.3-p551 :026 > a.push *c
=> [1, 2, 3, 4, 5]
1.9.3-p551 :027 > a.object_id
=> 6617020
Mi-e mai ușor să împingă sau să adăugați tablouri și apoi îndreptați-le în loc, astfel:
somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push anotherarray # => ["some", "thing", ["another", "thing"]]
#or
somearray << anotherarray # => ["some", "thing", ["another", "thing"]]
somearray.flatten! # => ["some", "thing", "another", "thing"]
somearray # => ["some", "thing", "another", "thing"]