【问题标题】:Create array of ranges with loop, combine ranges to array of Fixnum使用循环创建范围数组,将范围组合到 Fixnum 数组
【发布时间】:2013-05-09 20:55:15
【问题描述】:

我正在循环一组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吗?

谢谢

【问题讨论】:

  • 这不是提问的好方法。必须始终提供输入和输出,如果您尝试过任何代码,则必须提供。只有代码对我们没有帮助。

标签: ruby


【解决方案1】:

如果我理解正确的话,你有一个 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,根据需要删除。

【讨论】:

  • 我想你混淆了positionsize的含义。
【解决方案2】:

使用这种方法你会严重减少:

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]

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 2016-03-24
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2019-10-17
    相关资源
    最近更新 更多