如何在 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]