2014-11-21 24 views
-1
a = [1,2,3] 
b = [4,5 ] 

我要的是在同一時間重複這兩個收集和做迭代器什麼的,僞代碼將是這樣的:迭代兩個收集在同一時間

for i in a 
for j in b 
collect i * j 

當一個收集用完元素,循環停止。

結果將是[4, 10]

什麼我是這樣的:

a = [1,2,3] 
b = [4,5 ] 

a.zip(b).reject { |c| c.any? { |d| d.nil? } }.map { |e| e.reduce(&:*) } 

任何更好的解決方案?謝謝!

而我期待的完美解決方案是匹配我的僞代碼的意圖。

+0

如果你的代碼正在工作,而你只是想改進它,那麼這個問題就會成爲[so]的主題,併成爲[codereview.se]的主題。 – 2014-11-21 21:06:13

回答

2

你可以這樣做:

a, b = b, a if b.length < a.length 

a.zip(b).map { |ia, ib| ia * ib } 
# => [4, 10] 

第一行確保陣列a至多有相同數量的元素陣列b的。這是因爲zip創建了一個被調用數組長度的數組。將a作爲最短陣列確保不會有nil s。

1

這裏是另一種方式來做到這一點:

[a.length, b.length].min.times.map {|i| a[i]*b[i] } 

的想法是,你把兩個數組的長度,[a.length, b.length].min的短,你迭代,超過整數,i很多次,您可以使用作爲數組的索引。