如何在 ruby(rails) 中使用带整数的数组创建带范围的数组?
how to create an array with ranges using an array with integer in ruby(rails)?
我有一个排序整数数组
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] 除外)
有什么解决方案或想法吗?
感谢您的回答。
p.s.: 2015 年新年快乐
你可以迭代数组的所有元素并将之前的值保存在外部变量中,像这样:
last = -1
array.collect {|x| prev = last; last = x; (prev+1..x)}
添加辅助值 -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.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]
我有一个排序整数数组
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] 除外)
有什么解决方案或想法吗?
感谢您的回答。
p.s.: 2015 年新年快乐
你可以迭代数组的所有元素并将之前的值保存在外部变量中,像这样:
last = -1
array.collect {|x| prev = last; last = x; (prev+1..x)}
添加辅助值 -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.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]