如何根据另一个数组中的匹配值重复数组中的某些项?

时间:2013-05-17 03:31:29

标签: ruby-on-rails ruby arrays

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

我有一个代表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:

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

4 个答案:

答案 0 :(得分: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 }

答案 1 :(得分: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]

答案 2 :(得分: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

答案 3 :(得分: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