somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
oczekiwałem
["some","thing","another","thing"]
ruby
arrays
multidimensional-array
ncvncvn
źródło
źródło
ri Array@flatten!
Dlaczego to pytanie dostaje tyle głosów? Dokument jest wyraźnieArray#flatten!
spłaszczony na miejscu. Zwraca zero, jeśli nie wprowadzono żadnych modyfikacji (tj. Tablica nie zawiera żadnych podcieni.)flatten!
tak nie działa. Wreszcie pytanie odzwierciedla raczej problem logiczny niż problem optymalizacji. Zobacz odpowiedź pilcrowa poniżej.Odpowiedzi:
Masz realne pomysł, ale
#flatten!
jest w złym miejscu - to spłaszcza swój odbiornik, więc można go używać, aby włączyć[1, 2, ['foo', 'bar']]
się[1,2,'foo','bar']
.Bez wątpienia zapominam o niektórych podejściach, ale można połączyć :
lub dołącz / dołącz :
lub splicować :
lub dołącz i spłaszcz :
źródło
Array#concat
nie przydziela nowej tablicy, Concatenation withArray#+
doesMożesz po prostu użyć
+
operatora!Wszystko o klasie macierzy możesz przeczytać tutaj: http://ruby-doc.org/core/classes/Array.html
źródło
a+= b
tworzy nową tablicę:c = a = [1,2] ; b = [3,4] ; a += b ; puts c #=> [1,2]
push
metodzie opisanej przez @pilcrow.+=
tworzy nowy obiekt. w takim przykładzie zostanie zwrócona[1, 2].each_with_object([]) { |number, object| object+=number }
pusta tablica[]
Najczystszym podejściem jest użycie metody Array # concat ; nie utworzy nowej tablicy (w przeciwieństwie do Array # +, która zrobi to samo, ale utworzy nową tablicę).
Prosto z dokumentacji ( http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat ):
Więc
Tablica # concat nie spłaszczy wielowymiarowej tablicy, jeśli zostanie przekazana jako argument. Musisz poradzić sobie z tym osobno:
Na koniec możesz użyć naszego klejnotu corelib ( https://github.com/corlewsolutions/corelib ), który dodaje użyteczne pomocniki do klas podstawowych Ruby. W szczególności mamy metodę Array # add_all , która automatycznie spłaszczy tablice wielowymiarowe przed wykonaniem concat.
źródło
Prosta metoda, która działa z wersją Ruby> = 2.0, ale nie ze starszymi wersjami:
źródło
*
tutaj dzieje ?[*a, *b]
kończy się niepowodzeniem dla starszych wersji ruby, tj. 1.8.7. I o ile Ruby chce powiedzieć, że nie ma już życia, RHEL6 jest nadal utrzymywany, co czyni Ruby 1.8 bardzo znaczącą wersją docelową.[...array1, ...array2]
, po prostu pamiętając, że zamiast tegosplat
byłby operator w języku ruby . Ułatwia to zapamiętanie*
...
Spróbuj, połączy tablice usuwając duplikaty
http://www.ruby-doc.org/core/classes/Array.html
Dalsza dokumentacja znajduje się w części „Ustawianie Unii”
źródło
array1 |= [ "foo1", "bar1" ] #=> [ "foo", "bar", "foo1", "bar1" ]
Oto dwa sposoby, zauważ w tym przypadku, że pierwszy sposób przypisuje nową tablicę (przekłada się na somearray = somearray + anotherarray)
źródło
Aby dołączyć
b
doa
i zapisać wynik wa
:lub
W obu przypadkach
a
staje się:ale w pierwszym przypadku elementy
b
są dołączane do istniejąceja
tablicy, aw drugim przypadku dwie tablice są łączone razem, a wynik jest przechowywany wa
.źródło
a.push(*b)
nie jest dokładnie taki sam jaka += b
. Ten pierwszy dodaje nowe elementy do istniejącej tablicy; ten ostatni tworzy nową tablicę ze wszystkimi elementami i przypisuje ją doa
. Możesz zobaczyć różnicę, jeśli zrobisz coś takiego,aa = a
aby zapisać odwołaniea
przed którąkolwiek z metod dołączania, a następnie sprawdźaa
później. W pierwszym przypadku zmienia się z nową wartościąa
, aw drugim pozostaje niezmieniony.(array1 + array2).uniq
W ten sposób dostajesz najpierw elementy tablicy1. Nie dostaniesz duplikatów.
źródło
Opracowując odpowiedź @ Pilcrow, jedyną odpowiednią odpowiedzią dla ogromnych tablic jest
concat
(+
), ponieważ jest szybka i nie przydziela nowego obiektu do zrzucenia elementów bezużytecznych podczas pracy w pętli.Oto punkt odniesienia:
Wyniki:
Jak widać użycie
push
rzuca BŁĄD :stack level too deep (SystemStackError)
gdy tablice są wystarczająco duże.źródło
Zasadniczo pytanie brzmi: „jak łączyć tablice w Rubim”. Oczywiście odpowiedzią jest użycie
concat
lub+
jak wspomniano w prawie każdej odpowiedzi.Naturalnym rozszerzeniem tego pytania byłoby „jak wykonać wierszowanie konkatenacji tablic 2D w Rubim”. Kiedy przejrzałem „rubinowe konkatenowane matryce”, to SO pytanie było najlepszym wynikiem, więc pomyślałem, że zostawię moją odpowiedź na to (nie zadane, ale powiązane) pytanie tutaj dla potomności.
W niektórych aplikacjach możesz chcieć „połączyć” dwie tablice 2D w rzędy. Coś jak,
Jest to coś w rodzaju „powiększania” macierzy. Na przykład wykorzystałem tę technikę, aby utworzyć pojedynczą macierz przylegania do reprezentowania wykresu z szeregu mniejszych macierzy. Bez tej techniki musiałbym iterować komponenty w sposób, który mógłby być podatny na błędy lub frustrujący do myślenia. Być może musiałbym
each_with_index
na przykład zrobić . Zamiast tego połączyłem zip i spłaszczyć w następujący sposób,źródło
Po prostu inny sposób na zrobienie tego.
źródło
flatten
rekurencyjnie spłaszcza wszystko tak daleko, jak to możliwe. Nawet zagnieżdżone tablice. W konsekwencji, jeślisomearray
lubanotherarray
zawiera zagnieżdżone tablice, one również ulegają spłaszczeniu. Jest to efekt uboczny, który zwykle nie jest zamierzony.["some", "thing"] + ["another" + "thing"]
źródło
[*a] + [*b]
działa"another" + "thing"
żeby działało zgodnie z oczekiwaniami.Jeśli nowe dane mogą być tablicą lub skalarem, a chcesz zapobiec zagnieżdżeniu nowych danych, jeśli była to tablica, operator splat jest niesamowity! Zwraca skalar dla skalara i rozpakowaną listę argumentów dla tablicy.
źródło
Dziwię się, że nikt o tym nie wspominał
reduce
, co działa dobrze, gdy masz szereg tablic:źródło
To nie usunie duplikatów, ale
usuwa dups.
źródło
Łatwiej jest mi pchać lub dodawać tablice, a następnie spłaszczyć je w miejscu, w ten sposób:
źródło
somearray = [„some”, „thing”]
anotherarray = [„another”, „thing”]
somearray + anotherarray
źródło