0

我正在遍历一组foo具有starting_postionsize

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稍后?

谢谢

4

2 回答 2

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]
于 2013-05-10T04:42:37.307 回答
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,根据需要删除。

于 2013-05-10T03:44:27.927 回答