0

我已经尝试了几个星期来解决这个问题,但我完全被难住了。

我有一个代表item_id's:的数组[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:

我希望我能奖励多个正确答案!感谢大家!

4

4 回答 4

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 }
于 2013-05-17T03:47:22.037 回答
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 数组,计数对。

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]
于 2013-05-17T03:58:00.010 回答
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
于 2013-05-17T03:45:43.940 回答
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
于 2013-05-17T03:42:23.647 回答