我想知道如何在Ruby中将一个范围分成N个部分,同时将它们添加到一个哈希表中,并为生成的每个范围使用从零开始的值。
例如:
我已经阅读了有关如何在Ruby中将范围切片为数组的文章,例如How to return a part of an array in Ruby?,以及其他一些有关如何将切片转换回范围的文章,但我似乎无法将所有这些部分拼凑在一起,创建出我想要的方法。
谢谢您的帮助。
例如:
range = 1..60
p split(range, 4)
#=> {1..15 => 0, 16..30 => 1, 31..45 => 2, 46..60 => 3}
我已经阅读了有关如何在Ruby中将范围切片为数组的文章,例如How to return a part of an array in Ruby?,以及其他一些有关如何将切片转换回范围的文章,但我似乎无法将所有这些部分拼凑在一起,创建出我想要的方法。
谢谢您的帮助。
.each_slice(15).map.with_index { |d, i| { (d.first..d.last) => i } }
可能更易读. - Ilyaruby 2.2.3p173 (2015-08-18 revision 51636) [x64-mingw32]
,您的代码返回了{[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]=>0, [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]=>1, [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]=>2, [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60]=>3}
而不是{1..15=>0, 16..30=>1, 31..45=>2, 46..60=>3}
。是否有一些小疏忽?如果没有,如何检测单个整数是否落在键范围内并返回其值。再次感谢。 - randy newfieldhash.detect {|k,v| k === 4}.last
来返回 4 所在范围的值。由于哈希表的类型是array=>integer
而不是range=>integer
,这种方法将不再起作用。有没有其他方法来解决这个问题的一部分?编辑:目前hash.detect {|k,v| k.include?(4)}.last
可以工作。再次感谢。 - randy newfield