Mai mult
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"]
448
17
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:
sau prefixeaza/adăugare:
sau îmbinare:
sau adăugați și aplatiza:
Puteți folosi doar butonul " + " operator!
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):
Deci
Matrice#concat nu va aplatiza o matrice multidimensionale dacă este trecut în calitate de argument. Te'll nevoie să se ocupe de asta separat:
Î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
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 :
Aici sunt două moduri, observă în acest caz că prima cale atribuie o nouă matrice ( se traduce somearray = somearray + anotherarray )
(array1 + array2).uniq
În acest fel veți obține array1 primele elemente. Veți obține duplicate.
Pentru a adăuga " b " în " a "și stochează rezultatul în "a":
sau
În orice caz, " a " devine:
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ță:
Rezultate:
După cum puteți vedea, folosind "push", aruncă o **** EROARE:
stivă nivel prea adânc (SystemStackError)
când tablouri sunt suficient de mari.Doar un alt mod de a face aceasta.
Î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,
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ă,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.
["unii", "ceva"] + ["alte" + "ceva"]
Am'm-a surprins nimeni nu a menționat "reduce", care funcționează bine atunci când aveți o serie de tablouri:
Asta nu't a elimina dups, dar
elimină dups.
Mi-e mai ușor să împingă sau să adăugați tablouri și apoi îndreptați-le în loc, astfel:
somearray = ["unii", "ceva"]
anotherarray = ["alte", "ceva"]
somearray + anotherarray