交錯兩個數組我有以下代碼:合併和紅寶石
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
我想數組s
到數組a
這會給我合併:
["Cat", "and", "Dog", "&", "Mouse"]
通過紅寶石陣展望和可枚舉的文檔,我沒有看到這樣的方法來完成這一點。
有沒有一種方法可以做到這一點,而無需遍歷每個數組?
交錯兩個數組我有以下代碼:合併和紅寶石
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
我想數組s
到數組a
這會給我合併:
["Cat", "and", "Dog", "&", "Mouse"]
通過紅寶石陣展望和可枚舉的文檔,我沒有看到這樣的方法來完成這一點。
有沒有一種方法可以做到這一點,而無需遍歷每個數組?
你可以做到這一點:
a.zip(s).flatten.compact
如果'a'有3個以上的元素會怎麼樣? –
完美工作,謝謝! –
@DigitalRoss爲什麼s.zip(a).flatten.compact只返回4個元素? – dcarneiro
這不完全優雅,但它適用於任何大小的數組:
>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2]
#=> ["Cat", "and", "Dog", "&", "Mouse"]
+ 1用於處理奇怪的邊緣情況,我想'i = s.cycle; a.map {| x | [x,i.next]} .flatten [0 ..-2]'雖然同樣有效。 –
我不確定OP是否希望替換'和'和'&',所以我儘可能逐字地帶他,同時允許任意長度的'a'。 –
這不會給的順序克里斯結果數組要求,但如果結果數組的順序無關緊要,則可以使用a |= b
。如果你不想改變a
,你可以寫a | b
並將結果賦值給一個變量。
請參閱http://www.ruby-doc.org/core/classes/Array.html#M000275的Array類的set union文檔。
這個答案假定你不想重複數組元素。如果你想允許最終數組中的重複元素,a += b
應該做的伎倆。再次,如果您不想變異a
,請使用a + b
並將結果分配給變量。
作爲對本頁面的一些評論的迴應,這兩個解決方案將適用於任何大小的數組。
這絕對是最好的。 – ardavis
這給出了[[貓],「狗」,「鼠標」,「和」,「&」]',這不是OP想要的。 –
優秀的電話,安德魯。我會更新我的回答,說我沒有回答克里斯的問題。 –
s.inject(a, :<<)
s #=> ["and", "&"]
a #=> ["Cat", "Dog", "Mouse", "and", "&"]
它沒有給你你要求的順序,但它是通過追加到一個數組合並兩個數組的好方法。
我喜歡它,簡短而乾淨。 :) –
arr = [0, 1]
arr + [2, 3, 4]
//outputs [0, 1, 2, 3, 4]
你沒有看過這個問題。 –
抱歉...沒有注意到你想輸出的具體順序。抱歉試圖幫助,不會再發生。 –
這裏有一個解決方案,讓交錯不同尺寸的多個陣列(一般解決方案):
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"]
不錯!一個限制,第一個陣列必須是最長的。 –
@BrianLow很棒! – Abdo
怎麼樣的工程,即使第一個數組是不是最長的,並且接受一個更通用的解決方案任何數量的數組?
a = [
["and", "&"],
["Cat", "Dog", "Mouse"]
]
b = a.max_by(&:length)
a -= [b]
b.zip(*a).flatten.compact
=> ["Cat", "and", "Dog", "&", "Mouse"]
一種方式做交錯,也保證哪一個是對的zip方法最大的陣列,用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"]
a將始終有3個元素和兩個?一些更多的例子會很有用。 – tokland
@PetrolMan現在嘗試 –