2011-09-05 91 views
96

交錯兩個數組我有以下代碼:合併和紅寶石

a = ["Cat", "Dog", "Mouse"] 
s = ["and", "&"] 

我想數組s到數組a這會給我合併:

["Cat", "and", "Dog", "&", "Mouse"] 

通過紅寶石陣展望和可枚舉的文檔,我沒有看到這樣的方法來完成這一點。

有沒有一種方法可以做到這一點,而無需遍歷每個數組?

+0

a將始終有3個元素和兩個?一些更多的例子會很有用。 – tokland

+0

@PetrolMan現在嘗試 –

回答

163

你可以做到這一點:

a.zip(s).flatten.compact 
+3

如果'a'有3個以上的元素會怎麼樣? –

+1

完美工作,謝謝! –

+0

@DigitalRoss爲什麼s.zip(a).flatten.compact只返回4個元素? – dcarneiro

5

這不完全優雅,但它適用於任何大小的數組:

>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2] 
#=> ["Cat", "and", "Dog", "&", "Mouse"] 
+0

+ 1用於處理奇怪的邊緣情況,我想'i = s.cycle; a.map {| x | [x,i.next]} .flatten [0 ..-2]'雖然同樣有效。 –

+0

我不確定OP是否希望替換'和'和'&',所以我儘可能逐字地帶他,同時允許任意長度的'a'。 –

33

這不會給的順序克里斯結果數組要求,但如果結果數組的順序無關緊要,則可以使用a |= b。如果你不想改變a,你可以寫a | b並將結果賦值給一個變量。

請參閱http://www.ruby-doc.org/core/classes/Array.html#M000275的Array類的set union文檔。

這個答案假定你不想重複數組元素。如果你想允許最終數組中的重複元素,a += b應該做的伎倆。再次,如果您不想變異a,請使用a + b並將結果分配給變量。

作爲對本頁面的一些評論的迴應,這兩個解決方案將適用於任何大小的數組。

+0

這絕對是最好的。 – ardavis

+10

這給出了[[貓],「狗」,「鼠標」,「和」,「&」]',這不是OP想要的。 –

+0

優秀的電話,安德魯。我會更新我的回答,說我沒有回答克里斯的問題。 –

7
s.inject(a, :<<) 

s #=> ["and", "&"] 
a #=> ["Cat", "Dog", "Mouse", "and", "&"] 

它沒有給你你要求的順序,但它是通過追加到一個數組合並兩個數組的好方法。

+0

我喜歡它,簡短而乾淨。 :) –

-1
arr = [0, 1] 
arr + [2, 3, 4] 

//outputs [0, 1, 2, 3, 4] 
+5

你沒有看過這個問題。 –

+5

抱歉...沒有注意到你想輸出的具體順序。抱歉試圖幫助,不會再發生。 –

6

這裏有一個解決方案,讓交錯不同尺寸的多個陣列(一般解決方案):

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"] 
+1

不錯!一個限制,第一個陣列必須是最長的。 –

+0

@BrianLow很棒! – Abdo

2

怎麼樣的工程,即使第一個數組是不是最長的,並且接受一個更通用的解決方案任何數量的數組?

a = [ 
    ["and", "&"], 
    ["Cat", "Dog", "Mouse"] 
] 

b = a.max_by(&:length) 
a -= [b] 
b.zip(*a).flatten.compact 

=> ["Cat", "and", "Dog", "&", "Mouse"] 
29

如果你不想重複,爲什麼不直接使用union操作:

new_array = a | s 
+1

爲低估,簡單,優雅的解決方案頒發+1。 – JakeGould

+0

當然它回答了這個問題!問題是:「我想將數組s合併到數組中」 – Douglas

+0

好的解決方案 - 但這確實會改變結果的順序。 's'的結果將在新數組的末尾。 – Hendrik

0

一種方式做交錯,也保證哪一個是對的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"]