2013-05-17 22 views
0

我已經嘗試了幾個星期來弄清楚,但我完全難住。我有一個代表item_id的數組:[2, 4, 5, 6, 2, 3]如何根據另一個數組中的匹配值重複數組中的某些項目?

我有另一個數組表示每個項目出現多少次:[1, 1, 3, 3, 2, 5]

我想檢查所有項目都已完成,所以我想創建一個總數爲item_id的數組。我會比較反對在用戶完成每一個項目將創建一個完整的項目陣列排列,所以,從上面的例子中,我試圖創建數組是:

[2, 4, 5, 5, 5, 6, 6, 6, 2, 2, 3, 3, 3, 3, 3] 

編輯:

我正在構建一個鍛鍊應用程序,所以用戶有一個有許多練習的鍛鍊。每個練習都有一個或多個與之相關的集合。用戶在完成該練習的每一組練習時完成練習,並在完成該練習的所有練習時完成鍛鍊。在這個問題中,我試圖確定用戶何時完成鍛鍊。

編輯2:

我希望我能多獎勵正確的答案!感謝大家!

+0

你介意告訴我們更多關於特定域的信息嗎?什麼是完成? – depa

+0

爲什麼你的item_id在第一個數組中重複?我們如何區分一個和另一個?這是爲0,2的情況,並且數組可能看起來像這樣[2,2,2,3,4,5] [2,0,1,1,1,1] [2,3,4 5] – Sanchit

+0

@depa當然!我只是想保持簡單。我更新了這個問題,提供了更多關於我正在使用應用程序的信息。 – Arel

回答

4
item_ids = [2, 4, 5, 6, 2, 3] 
counts = [1, 1, 3, 3, 2, 5] 
item_ids.zip(counts).map{|item_id,count| [item_id]*count}.flatten 
=> [2, 4, 5, 5, 5, 6, 6, 6, 2, 2, 3, 3, 3, 3, 3] 

這是怎麼回事?我們一步一步來看。

zip需要兩個數組並將它們「逐個」拉到一起。我這樣做是爲了創建一個item_id,count對的數組。

item_ids.zip(counts) 
=> [[2, 1], [4, 1], [5, 3], [6, 3], [2, 2], [3, 5]] 

map獲取數組的每個元素並執行一個塊。在這種情況下,我使用*運算符將每個item_id擴展爲一個count元素的數組。

[1]*3 => [1, 1, 1] 
[[2, 1], [4, 1], [5, 3], [6, 3], [2, 2], [3, 5]].map{|item_id,count| [item_id]*count} 
=> [[2], [4], [5, 5, 5], [6, 6, 6], [2, 2], [3, 3, 3, 3, 3]] 

最後,flatten需要數組的數組和「變平」它分解爲一維數組。

[[2], [4], [5, 5, 5], [6, 6, 6], [2, 2], [3, 3, 3, 3, 3]].flatten 
=> [2, 4, 5, 5, 5, 6, 6, 6, 2, 2, 3, 3, 3, 3, 3] 
+1

+1分解爲OP。 –

+0

只是爲了指出OP,這個答案基本上和@Speransky Danil的答案一樣,但他的提交是第一個。 –

+0

謝謝@theTinMan。我授予了這個答案,因爲它解釋了爲什麼這樣做是如此出色。我希望我可以給予這兩個答案。 – Arel

1

這是做這件事的一種方法:

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

a.each.with_index do |index, i| 
    b[index].to_i.times {c << i } 
end 
p c 
+1

爲什麼使用'b [index] .to_i'?爲什麼不'b [index]'因爲'b'只包含開頭的整數?爲什麼'each.with_index'而不是'each_with_index'? –

1
ids = [2, 4, 5, 6, 2, 3] 
repeats = [1, 1, 3, 3, 2, 5] 

result = [] 
ids.count.times do |j| 
    repeats[j].times { result << ids[j] } 
end 
5

好吧,@ sameera207建議的一種方式,那麼我會建議另一種方式(功能型):

arr1 = [2, 4, 5, 6, 2, 3] 
arr2 = [1, 1, 3, 3, 2, 5] 

arr1.zip(arr2).flat_map { |n1, n2| [n1] * n2 } 
+0

而不是使用'map {...} .flatten'嘗試'flat_map'。 –

相關問題