2016-09-20 64 views
-1

我有個月的數組和數量是這樣的...減去陣列中的一個陣列從另一個紅寶石

a = [[9, 2336.02], [8, 7993.6], [7, 5265.73], [6, 7075.33], [5, 9281.02], [4, 9524.64], [3, 300]] 

然後我有另一個像這樣......

b = [[9, 2817.61], [8, 7033.74], [7, 5650.73], [6, 9206.72], [5, 8554.24], [4, 6682.1], [3, 2211.84]] 

我需要在保留鍵的同時從數組b中的數量中減去數組a中的金額。所以我的輸出應該像

c = [[9,-481.59], [8, 959.86],[...]] 

我試圖

a.each_with_index.map { |month, amount| amount - b.each { |months,cost| cost } 

,但似乎無法得到它的權利。我將不勝感激任何幫助。

+0

@jordan,你是正確的遺憾。這是一個漫長的一天 – SupremeA

+0

你的意思是從'a'中減去數組'b'中的數量以與'c'一致。 –

+0

這兩個月的數組總是有相同的索引? – Stefan

回答

4

可以使用zip

c = a.zip(b).map{|k| [k[0][0], (k[0][1] - k[1][1]).round(2)] } 
#=> [[9, -481.59], [8, 959.86], [7, -385.0], [6, -2131.39], [5, 726.78], [4, 2842.54], [3, -1911.84]] 
3

你並不遙遠,但在你的嘗試中,你忘記了實際使用索引。

你大概的意思做這樣的事情:

a.each_with_index.map {|(month, amount), i| [ month, amount - b[i][1] ] } 

我們可以讓這個更 「Rubyish」 與Array#zip

a.zip(b).map {|(month, amount_a), (_, amount_b)| [ month, amount_a - amount_b ] } 
+0

這個zip方法給了我這個輸出[[[9,2336.02],-2817.61],[[8,7993.6],-7032.74],[[7,5265.73],-5648.73],[[6,7075.33] ,-9203.72],[[5,9281.02],-8550.24],[[4,9524.64], - 6677.1],[[3,300], - 2205.84]] – SupremeA

+0

也產生了[[[[9, [[8,7993.6], - 7032.74],[[7,5265.73], - 5648.73],[[6,7075.33], - 9203.72],[[5,9281.02], - 8550.24] ,[[4,9524.64],-6677.1],[[3,300],-2205。84]]這不正確 – SupremeA

+0

您可能希望仔細檢查您的輸入。 http://i.stack.imgur.com/JtC5k.png –

1

這是另一種方式。

[a,b].transpose.map(&:transpose).map { |(e,_),arr| [e, arr.reduce(:-)] } 
    #=> [[9, -481.59000000000015], [8, 959.8600000000006], [7, -385.0], 
    # [6, -2131.3899999999994], [5, 726.7800000000007], [4, 2842.539999999999], 
    # [3, -1911.8400000000001]] 

步驟如下。

c = [a,b].transpose 
    #=> [[[9, 2336.02], [9, 2817.61]], [[8, 7993.6], [8, 7033.74]], 
    # [[7, 5265.73], [7, 5650.73]], [[6, 7075.33], [6, 9206.72]], 
    # [[5, 9281.02], [5, 8554.24]], [[4, 9524.64], [4, 6682.1]], 
    # [[3, 300], [3, 2211.84]]] 
d = c.map(&:transpose) 
    #=> [[[9, 9], [2336.02, 2817.61]], [[8, 8], [7993.6, 7033.74]], 
    # [[7, 7], [5265.73, 5650.73]], [[6, 6], [7075.33, 9206.72]], 
    # [[5, 5], [9281.02, 8554.24]], [[4, 4], [9524.64, 6682.1]], 
    # [[3, 3], [300, 2211.84]]] 
d.map { |(e,_),arr| [e, arr.reduce(:-)] } 
    #=> [[9, -481.59000000000015], [8, 959.8600000000006], [7, -385.0], 
    # [6, -2131.3899999999994], [5, 726.7800000000007], [4, 2842.539999999999], 
    # [3, -1911.8400000000001]] 

讓我們仔細檢查最後的計算。

enum = d.map 
    #=> #<Enumerator: [[[9, 9], [2336.02, 2817.61]], [[8, 8], [7993.6, 7033.74]], 
    #     [[7, 7], [5265.73, 5650.73]], [[6, 6], [7075.33, 9206.72]], 
    #     [[5, 5], [9281.02, 8554.24]], [[4, 4], [9524.64, 6682.1]], 
    #     [[3, 3], [300, 2211.84]]]:map> 

由枚舉器生成的第一個元素傳遞給塊並分配給塊變量。

(e,_),arr = enum.next 
    #=> [[9, 9], [2336.02, 2817.61]] 
e #=> 9 
_ #=> 9 
arr 
    #=> [2336.02, 2817.61] 
arr.reduce(:-) 
    #=> -481.59000000000015 

因此返回數組[9, -481.59000000000015]

其餘的計算是相似的。

1

這裏是這樣做另一種方式:

(0...a.size).map { |i| [a[i].first, a[i].last - b[i].last] } 
+0

嘿,大家,尖尖的男人回來了! –

+0

@CarySwoveland感謝Cary的歡迎!一直忙於工作。我可能仍然沒有像2015年的最後一個季度那樣活躍,會偶爾陷入尷尬境地 –