somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
eu esperava
["some","thing","another","thing"]
ruby
arrays
multidimensional-array
ncvncvn
fonte
fonte
ri Array@flatten!
Por que essa pergunta está recebendo tantos votos? O documento é explícitoArray#flatten!
Achatar-se. Retorna nulo se nenhuma modificação foi feita (ou seja, a matriz não contém sub-matrizes).flatten!
não funciona assim. Finalmente, a pergunta reflete um problema lógico e não um problema de otimização. Veja a resposta de pilcrow abaixo para obter mais.Respostas:
Você tem uma idéia viável, mas o
#flatten!
é no lugar errado - ele achata o seu receptor, para que você possa usá-lo para transformar[1, 2, ['foo', 'bar']]
em[1,2,'foo','bar']
.Sem dúvida, estou esquecendo algumas abordagens, mas você pode concatenar :
ou acrescentar / acrescentar :
ou emenda :
ou acrescentar e achatar :
fonte
Array#concat
não alocar uma nova matriz, concatenação comArray#+
fazVocê pode apenas usar o
+
operador!Você pode ler tudo sobre a classe array aqui: http://ruby-doc.org/core/classes/Array.html
fonte
a+= b
cria uma nova matriz:c = a = [1,2] ; b = [3,4] ; a += b ; puts c #=> [1,2]
push
método descrito por @pilcrow.+=
cria um novo objeto. nesse exemplo, a[1, 2].each_with_object([]) { |number, object| object+=number }
matriz vazia[]
será retornadaA abordagem mais limpa é usar o método Arrat # concat ; ele não criará uma nova matriz (diferente da Matriz # +, que fará a mesma coisa, mas criará uma nova matriz).
Diretamente dos documentos ( http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat ):
assim
A matriz # concat não achatará uma matriz multidimensional se for passada como argumento. Você precisará lidar com isso separadamente:
Por fim, você pode usar a nossa corelib gem ( https://github.com/corlewsolutions/corelib ), que adiciona ajudantes úteis às classes principais do Ruby. Em particular, temos um método Array # add_all que achatará automaticamente as matrizes multidimensionais antes de executar a concat.
fonte
Método fácil que funciona com a versão Ruby> = 2.0, mas não com versões mais antigas:
fonte
*
aqui?[*a, *b]
falha nas versões mais antigas do ruby, ou seja, 1.8.7. E, por mais que o Ruby queira lhe dizer que está fora da vida, o RHEL6 ainda é mantido, tornando o Ruby 1.8 uma versão de destino muito significativa.[...array1, ...array2]
, apenas lembrando que osplat
operador em ruby seria em*
vez de...
. Isso facilita a lembrançaTente isso, ele combinará suas matrizes removendo duplicatas
http://www.ruby-doc.org/core/classes/Array.html
Mais documentação veja "Set Union"
fonte
array1 |= [ "foo1", "bar1" ] #=> [ "foo", "bar", "foo1", "bar1" ]
Aqui estão duas maneiras, observe, neste caso, que a primeira maneira atribui uma nova matriz (traduz-se em somearray = somearray + anotherarray)
fonte
Para anexar
b
aa
e armazenar o resultado ema
:ou
Em qualquer um dos casos,
a
torna-se:mas no primeiro caso, os elementos de
b
são anexados àa
matriz existente e, no último caso, as duas matrizes são concatenadas juntas e o resultado é armazenado ema
.fonte
a.push(*b)
não é exatamente o mesmo quea += b
. O primeiro adiciona os novos elementos à matriz existente; o último cria uma nova matriz com todos os elementos e a atribuia
. Você pode ver a diferença se fizer algo comoaa = a
salvar o refa
antes de qualquer método de adição e depois examinaraa
depois. No primeiro caso, ele muda com o novo valor dea
e, no segundo, permanece inalterado.(array1 + array2).uniq
Dessa forma, você obtém os elementos do array1 primeiro. Você não receberá duplicatas.
fonte
Ao elaborar a resposta do @ Pilcrow, a única resposta adequada para grandes matrizes é
concat
(+
), pois é rápida e não aloca um novo objeto a ser coletado como lixo ao operar dentro de um loop.Aqui está a referência:
Resultados:
Como você pode ver, usando
push
throws um ERRO :stack level too deep (SystemStackError)
quando as matrizes são grandes o suficiente.fonte
A questão, essencialmente, é "como concatenar matrizes em Ruby". Naturalmente, a resposta é usar
concat
ou+
como mencionado em quase todas as respostas.Uma extensão natural para a pergunta seria "como executar concatenação em linha de matrizes 2D em Ruby". Quando pesquisei "matrizes de concatenação de rubi" no Google, essa pergunta do SO foi o principal resultado, então pensei em deixar minha resposta para essa pergunta (não solicitada, mas relacionada) aqui para a posteridade.
Em alguns aplicativos, convém concatenar duas matrizes 2D em linhas. Algo como,
Isso é algo como "aumentar" uma matriz. Por exemplo, usei essa técnica para criar uma única matriz de adjacência para representar um gráfico de várias matrizes menores. Sem essa técnica, eu teria que percorrer os componentes de uma maneira que poderia ter sido propensa a erros ou frustrante de se pensar. Eu poderia ter que fazer um
each_with_index
, por exemplo. Em vez disso, combinei o zíper e o achatamento da seguinte maneira:fonte
Apenas outra maneira de fazer isso.
fonte
flatten
nivela tudo o mais longe possível, recursivamente. Até matrizes aninhadas. Conseqüentemente, sesomearray
ouanotherarray
contém matrizes aninhadas, elas também são achatadas. Este é um efeito colateral que geralmente não se destina.["some", "thing"] + ["another" + "thing"]
fonte
[*a] + [*b]
funciona"another" + "thing"
isso funcionará como esperado.Se os novos dados puderem ser uma matriz ou escalar, e você desejar impedir que os novos dados sejam aninhados, se for uma matriz, o operador splat é incrível! Ele retorna um escalar para um escalar e uma lista descompactada de argumentos para uma matriz.
fonte
Estou surpreso que ninguém tenha mencionado
reduce
, o que funciona bem quando você tem uma matriz de matrizes:fonte
Isso não remove dups, mas
remove dups.
fonte
Acho mais fácil empurrar ou anexar matrizes e achatá-las no lugar, da seguinte maneira:
fonte
somearray = ["alguns", "coisa"]
anotherarray = ["outro", "coisa"]
somearray + anotherarray
fonte