Eu tenho o seguinte código:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Eu quero mesclar a matriz s
em uma matriz a
que me daria:
["Cat", "and", "Dog", "&", "Mouse"]
Olhando através da documentação Ruby Array e Enumerable, não vejo um método que faça isso.
Existe uma maneira de fazer isso sem iterar em cada array?
Respostas:
Você pode fazer isso com:
fonte
a
tiver mais de 3 elementos?[a, s].transpose
exceto que as duas linhas não estão em conformidade, deixando#zip
como a solução óbvia. E eu não acredito que ele quis dizer que ele realmente se importava sea
era mutado ... Eu não acho que ele estava comentando sobre uma solução mutada versus funcional, ele estava apenas tentando descrever o padrão.Isso não dará um array de resultado na ordem que Chris pediu, mas se a ordem do array resultante não importa, você pode apenas usar
a |= b
. Se você não deseja sofrer mutaçãoa
, pode escrevera | b
e atribuir o resultado a uma variável.Consulte a documentação do conjunto de união para a classe Array em http://www.ruby-doc.org/core/classes/Array.html#M000275 .
Esta resposta pressupõe que você não deseja elementos de array duplicados. Se você quiser permitir elementos duplicados em seu array final,
a += b
deve resolver o problema. Novamente, se você não deseja sofrer mutaçãoa
, usea + b
e atribua o resultado a uma variável.Em resposta a alguns dos comentários nesta página, essas duas soluções funcionarão com arrays de qualquer tamanho.
fonte
["Cat", "Dog", "Mouse", "and", "&"]
, o que não é o que o OP queria.Se você não quiser duplicar, por que não usar apenas o operador de união :
fonte
s
estarão no final da nova matriz.Não fornece a ordem solicitada, mas é uma boa maneira de mesclar duas matrizes anexando a uma.
fonte
Aqui está uma solução que permite intercalar várias matrizes de tamanhos diferentes (solução geral):
fonte
Não é exatamente elegante, mas funciona para matrizes de qualquer tamanho:
fonte
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]
que seria igualmente válido.and
e&
, então eu o tomei o mais literalmente possível, embora permitindoa
qualquer comprimento.Que tal uma solução mais geral que funcione mesmo se o primeiro array não for o mais longo e aceitar qualquer número de arrays?
fonte
Para lidar com a situação em que
a
es
não são do mesmo tamanho:.compact
irá removernil
quandoa
for maior ques
| s
irá adicionar os itens restantes des
quandoa
for menor ques
fonte
Uma forma de fazer a intercalação e também garantir qual deles é o maior array para o método zip, é preencher um dos arrays com
nil
até o outro tamanho de array. Dessa forma, você também garante qual elemento de qual array estará na primeira posição:fonte
preferred_arr.zip(other_arr).flatten | other_arr
(sem o preenchimento zero)fonte