我有一系列uniq号码.像这样:[1,2,3,4,7,8,10,12].它可以是未分类的.我需要的是获得这个数组的间隔:
intervals_for [1,2,3,4,7,8,10,12]
#=> "1-4, 7-8, 10,12"
Run Code Online (Sandbox Code Playgroud)
我有自己的解决方案:
def intervals_for(array)
array.sort!
new_array = []
array.each do |a|
if new_array.last and a == new_array.last.last+1
new_array.last << a
else
new_array << [a]
end
end
new_array.map{|a| a.size > 1 ? "#{a.first}-#{a.last}" : a.first}.join(", ")
end
Run Code Online (Sandbox Code Playgroud)
但我认为这里的某个地方更清洁
我想接受以下输入:
[1,2,4,5,6,7,9,13]
Run Code Online (Sandbox Code Playgroud)
把它变成如下的东西:
[[1,2],[4,7],[9,9],[13,13]]
Run Code Online (Sandbox Code Playgroud)
每个子数组代表一个整数范围.
给定搜索字符串和结果字符串(保证包含搜索字符串的所有字母,按顺序不区分大小写),如何最有效地获取表示与字母对应的结果字符串中的索引的范围数组在搜索字符串中?
期望的输出:
substrings( "word", "Microsoft Office Word 2007" )
#=> [ 17..20 ]
substrings( "word", "Network Setup Wizard" )
#=> [ 3..5, 19..19 ]
#=> [ 3..4, 18..19 ] # Alternative, acceptable, less-desirable output
substrings( "word", "Watch Network Daemon" )
#=> [ 0..0, 10..11, 14..14 ]
Run Code Online (Sandbox Code Playgroud)
这是一个自动完成搜索框.这是一个类似于Quicksilver 的工具的截图,它突出了我想要的字母.请注意 - 与我上面的理想输出不同 - 此屏幕截图不喜欢更长的单一匹配.

对当前工作结果进行基准测试表明,@ tokland基于正则表达式的答案基本上与我提出的基于StringScanner的解决方案一样快,代码更少:
user system total real
phrogz1 0.889000 0.062000 0.951000 ( 0.944000)
phrogz2 0.920000 0.047000 0.967000 ( 0.977000)
tokland 1.030000 0.000000 1.030000 ( 1.035000)
Run Code Online (Sandbox Code Playgroud)
这是基准测试: …
我需要将连续数字添加到新数组中,如果它不是连续数字,则只将该值添加到新数组:
old_array = [1, 2, 3, 5, 7, 8, 9, 20, 21, 23, 29]
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果:
new_array = [
[1,2,3],
[5],
[7,8,9]
[20,21]
[23],
[29]
]
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?
如何将数组转换为具有0无each循环值的哈希值.
例如,给定此数组:
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
我想得到这个哈希:
{"1"=>0, "2"=>0, "3"=>0, "4"=>0}
Run Code Online (Sandbox Code Playgroud)