我正在循环使用foo
和starting_postion
size
if ! foo.position.nil?
@foo_top = foo.position + foo.size - 1
@occupied_array = (foo.position..@foo_top)
end
我看到我目前正在每个循环上重新分配数组。我的最终目标是将所有范围组合到一个Fixnums数组中,以便我可以进行比较。
我应该:@occupied_array += (foo.position..@foo_top)
然后再@occupied_array.to_a
吗?
由于
答案 0 :(得分:0)
如果我理解正确,你有一组Foo
个对象,每个对象用起点和长度表示一系列整数。并且您希望生成一个整数数组,表示所有Foo
个对象所涵盖的所有值。
如果这是真的,请尝试以下内容:
Foo = Struct.new(:position, :size)
all_the_foos = [Foo.new(10,3), Foo.new(3,3), Foo.new(15,5)]
p all_the_foos.flat_map { |f| (f.position...(f.position+f.size)).to_a }.uniq.sort
#=> [3, 4, 5, 10, 11, 12, 15, 16, 17, 18, 19]
不确定是否需要#uniq
或#sort
,必要时删除。
答案 1 :(得分:0)
使用这种方法可以认真减少:
pos_size_pairs = [[1,5], [3,6], [15,2], [20,7]]
pos_size_pairs.map { |pos,sz| (pos...(pos+sz)).to_a }.reduce(:|)
=> [1, 2, 3, 4, 5, 6, 7, 8, 15, 16, 20, 21, 22, 23, 24, 25, 26]