回答:
あなたはそれを行うことができます:
a.zip(s).flatten.compact
a
3つ以上の要素がある場合はどうなりますか?
[a, s].transpose
#zip
a
これは、Chrisが要求した順序で結果の配列を提供しませんが、結果の配列の順序が重要でない場合は、を使用できますa |= b
。変更したくない場合は、結果をa
書き込んa | b
で変数に割り当てることができます。
http://www.ruby-doc.org/core/classes/Array.html#M000275にあるArrayクラスのセットユニオンドキュメントを参照してください。
この回答は、重複する配列要素が不要であることを前提としています。最終的な配列で要素の重複を許可する場合a += b
は、トリックを実行する必要があります。繰り返しますが、mutateしたくない場合は、結果をa
使用a + b
して変数に割り当てます。
このページのコメントのいくつかに応えて、これら2つのソリューションは任意のサイズの配列で機能します。
["Cat", "Dog", "Mouse", "and", "&"]
、これはOPが望んでいたものではない。
複製したくない場合は、ユニオン演算子を使用しないでください。
new_array = a | s
s
は、新しい配列の最後になります。
s.inject(a, :<<)
s #=> ["and", "&"]
a #=> ["Cat", "Dog", "Mouse", "and", "&"]
それはあなたが要求した順序を与えませんが、1つに追加することによって2つの配列をマージする良い方法です。
これは、異なるサイズの複数の配列をインターリーブできるソリューションです(一般的なソリューション)。
arr = [["Cat", "Dog", "Mouse", "boo", "zoo"],
["and", "&"],
["hello", "there", "you"]]
first, *rest = *arr; first.zip(*rest).flatten.compact
=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]
エレガントではありませんが、任意のサイズの配列で機能します。
>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2]
#=> ["Cat", "and", "Dog", "&", "Mouse"]
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]
は同様に有効だと思います。
and
と&
を可能にしながら、私は、文字通りできるだけ彼を連れて行ったので、a
任意の長さの。
a
&のs
サイズが同じではない状況に対処するには:
a.zip(s).flatten.compact | s
.compact
より大きい場合に削除さnil
れa
ますs
| s
がより小さいs
ときの残りのアイテムを追加しますa
s
インターリーブを実行し、zipメソッドの最大の配列を保証する1つの方法は、配列の1つをnil
他の配列サイズまで埋めることです。このようにして、どの配列のどの要素が最初の位置になるかを保証します。
preferred_arr = ["Cat", "Dog", "Mouse"]
other_arr = ["and","&","are","great","friends"]
preferred_arr << nil while preferred_arr.length < other_arr.length
preferred_arr.zip(other_arr).flatten.compact
#=> ["Cat", "and", "Dog", "&", "Mouse", "are", "great", "friends"]
preferred_arr.zip(other_arr).flatten | other_arr
(nilバックフィルなし)
arr = [0, 1]
arr + [2, 3, 4]
//outputs [0, 1, 2, 3, 4]