Mam następujący kod:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Chcę scalić tablicę s
w tablicę, a
co dałoby mi:
["Cat", "and", "Dog", "&", "Mouse"]
Przeglądając Ruby Array i Enumerable docs, nie widzę takiej metody, która to umożliwi.
Czy istnieje sposób, w jaki mogę to zrobić bez iteracji po każdej tablicy?
Odpowiedzi:
Możesz to zrobić za pomocą:
źródło
a
ma więcej niż 3 elementy?[a, s].transpose
ale te dwa rzędy nie są zgodne, pozostawiając#zip
jako oczywiste rozwiązanie. I nie sądzę, żeby miał na myśli, że naprawdę obchodziło go, czya
został zmutowany… Nie sądzę, żeby w ogóle komentował rozwiązanie zmutowane i funkcjonalne, po prostu próbował opisać wzór.To nie da tablicy wyników w kolejności, o którą prosił Chris, ale jeśli kolejność wynikowej tablicy nie ma znaczenia, możesz po prostu użyć
a |= b
. Jeśli nie chcesz mutowaća
, możesz napisaća | b
i przypisać wynik do zmiennej.Zobacz dokumentację set union dla klasy Array pod adresem adresem http://www.ruby-doc.org/core/classes/Array.html#M000275 .
Ta odpowiedź zakłada, że nie chcesz zduplikowanych elementów tablicy. Jeśli chcesz zezwolić na zduplikowane elementy w ostatecznej tablicy,
a += b
powinieneś załatwić sprawę. Ponownie, jeśli nie chcesz mutowaća
, użyja + b
i przypisz wynik do zmiennej.W odpowiedzi na niektóre komentarze na tej stronie, te dwa rozwiązania będą działać z tablicami o dowolnym rozmiarze.
źródło
["Cat", "Dog", "Mouse", "and", "&"]
, czego nie chciał OP.Jeśli nie chcesz duplikatu, dlaczego nie użyć operatora unii :
źródło
s
będą na końcu nowej tablicy.Nie zapewnia kolejności, o którą prosiłeś, ale jest to dobry sposób na scalenie dwóch tablic przez dołączenie do jednej.
źródło
Oto rozwiązanie, które umożliwia przeplatanie wielu tablic o różnych rozmiarach (rozwiązanie ogólne):
źródło
Nie jest do końca elegancki, ale działa w przypadku tablic o dowolnym rozmiarze:
źródło
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]
byłoby równie ważne.and
i&
, więc wziąłem go dosłownie, jak to możliwe, jednocześnie pozwalając naa
dowolną długość.Co powiesz na bardziej ogólne rozwiązanie, które działa, nawet jeśli pierwsza tablica nie jest najdłuższa i akceptuje dowolną liczbę tablic?
źródło
Aby poradzić sobie z sytuacją, w której oba
a
&s
nie są tego samego rozmiaru:.compact
usunie,nil
gdya
jest większy niżs
| s
doda pozostałe elementy ods
kiedya
jest mniejsze niżs
źródło
Jednym ze sposobów wykonania przeplotu, a także zagwarantowania, która z nich jest największą tablicą dla metody zip, jest wypełnienie jednej z tablic
nil
do drugiego rozmiaru tablicy. W ten sposób gwarantujesz również, który element której tablicy będzie na pierwszej pozycji:źródło
preferred_arr.zip(other_arr).flatten | other_arr
(bez zasypki zerowej)źródło