使用循环创建范围数组,将范围与Fixnum数组合

时间:2013-05-09 20:55:16

标签: ruby

我正在循环使用foostarting_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吗?

由于

2 个答案:

答案 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]