【问题标题】:how to create an array with ranges using an array with integer in ruby(rails)?如何使用 ruby​​(rails) 中的整数数组创建具有范围的数组?
【发布时间】:2015-01-07 15:58:10
【问题描述】:

我有一个带有排序整数的数组

array = [1,4,10,14,22]

我想在一个数组之前创建一个

array_with_ranges = [[0..1],[2..4],[5..10],[11..14],[15..22]]

我无法创建正确的迭代器,我是 Rails 的新手。在每个范围内我都有 end_range 值,但不知道如何设置 start_range 值?在 array_with_ranges 的大多数范围中,start_range 是 +1 之前的 end_range([0..1] 除外)

有什么解决方案或想法吗?

谢谢你的回答。

ps:2015 年新年快乐

【问题讨论】:

    标签: ruby-on-rails ruby arrays integer range


    【解决方案1】:

    添加一个辅助值 -1,稍后将其删除。

    array = [1,4,10,14,22]
    array.unshift(-1)
    ranges = array.each_cons(2).map{|a,b| a+1..b} #=>[0..1, 2..4, 5..10, 11..14, 15..22]
    
    array.shift
    

    【讨论】:

      【解决方案2】:

      您可以迭代数组的所有元素并将之前的值保存在外部变量中,如下所示:

      last = -1 
      array.collect {|x| prev = last; last = x; (prev+1..x)}
      

      【讨论】:

        【解决方案3】:

        只需跟踪以前的值就可以了:

        2.1.5 :001 > array = [1,4,10,14,22]
         => [1, 4, 10, 14, 22] 
        2.1.5 :002 > previous = 0
         => 0 
        2.1.5 :003 > array.map { |i| rng = previous..i; previous = i + 1; rng }
         => [0..1, 2..4, 5..10, 11..14, 15..22] 
        

        我想有一种更巧妙的方法可以做到这一点。

        编辑:当然有,基于@steenslag 的回答:

        2.1.5 :001 > array = [1, 4, 10, 14, 22]
         => [1, 4, 10, 14, 22] 
        2.1.5 :002 > ([-1] + array).each_cons(2).map { |a,b| (a + 1)..b }
         => [0..1, 2..4, 5..10, 11..14, 15..22] 
        

        【讨论】:

          猜你喜欢
          • 2016-06-12
          • 1970-01-01
          • 1970-01-01
          • 2018-10-31
          • 1970-01-01
          • 2016-06-20
          • 1970-01-01
          • 2016-06-23
          • 1970-01-01
          相关资源
          最近更新 更多