Cum se adaugă o serie la alta matrice în Ruby și nu se încheie cu un multi-dimensional rezultatul?

somearray = ["some", "thing"]

anotherarray = ["another", "thing"]

somearray.push(anotherarray.flatten!)

M-am așteptat

["some","thing","another","thing"]
Comentarii la întrebare (6)

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 
Comentarii (14)

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

Comentarii (7)

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.

Comentarii (2)

Î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"

Comentarii (2)

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]
Comentarii (5)

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"]
Comentarii (0)

(array1 + array2).uniq

În acest fel veți obține array1 primele elemente. Veți obține duplicate.

Comentarii (0)
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".

Comentarii (1)

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 ': 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.

Comentarii (0)

Doar un alt mod de a face aceasta.

[somearray, anotherarray].flatten
=> ["some", "thing", "another", "thing"]
Comentarii (0)

Î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]]
Comentarii (0)

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 
Comentarii (0)

["unii", "ceva"] + ["alte" + "ceva"]

Comentarii (1)

Am'm-a surprins nimeni nu a menționat "reduce", care funcționează bine atunci când aveți o serie de tablouri:

lists = [["a", "b"], ["c", "d"]]
flatlist = lists.reduce(:+)  # ["a", "b", "c", "d"]
Comentarii (0)
a = ['a', 'b']
b = ['c', 'd']
arr = [a, b].flatten

Asta nu't a elimina dups, dar

a|b

elimină dups.

Comentarii (1)

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  ["some", "thing", ["another", "thing"]]
somearray.flatten!  # => ["some", "thing", "another", "thing"]
somearray # => ["some", "thing", "another", "thing"]
Comentarii (0)

somearray = ["unii", "ceva"]

anotherarray = ["alte", "ceva"]

somearray + anotherarray

Comentarii (0)