我有一个数组prices
:
[1399, 1435, 1465, 1715, 1745, 1760, 1825]
我想要一个介于最小和最大价格之间的范围数组,差异为100
。我需要这样的东西:
[1399..1499, 1499..1599, 1599..1699, 1699..1799, 1799..1899]
有单行吗?
答案 0 :(得分:4)
n = 100
arr = [1399, 1435, 1465, 1715, 1745, 1760, 1825]
start = arr.first
arr.slice_before do |x|
if x > start + n
start = x
true
else
false
end
end.map { |f,*_| f..f+n }
#=> [1399..1499, 1715..1815, 1825..1925]
返回数组中的第三个范围与两个方面所需的范围不同。第三个范围被要求为1815..1825
。我认为1815
是一个拼写错误,好像与第二个范围的逻辑不同。如果希望最后一个范围的结尾应该是arr
的最后一个元素,而不是该范围的第一个元素加n
,那么修复它只是有点混乱。它可以如下完成。
让
a = [1399..1499, 1715..1815, 1825..1925]
如上所述。然后
a[0..-2] << (a.last.begin..arr.last)
#=> [1399..1499, 1715..1815, 1825..1825]
答案 1 :(得分:1)
您n
(在这种情况下,100)可以step
:
array = [1399, 1435, 1465, 1715, 1745, 1760, 1825]
array.min.step(to: array.max + n, by: n).each_cons(2).map { |a, b| a..b }
# => [1399..1499, 1499..1599, 1599..1699, 1699..1799, 1799..1899]
array << 1899
array.min.step(to: array.max + n, by: n).each_cons(2).map { |a, b| a..b }
# => [1399..1499, 1499..1599, 1599..1699, 1699..1799, 1799..1899, 1899..1999]
请注意,step
未向块传递任何大于to:
的值,因此,如果您将最大值增加n
,事情似乎就会解决。