我一直在寻找一种优雅高效的方式,将一个字符串按给定长度切割成子字符串。
到目前为止,我能想到的最好方法是:
def chunk(string, size)
(0..(string.length-1)/size).map{|i|string[i*size,size]}
end
>> chunk("abcdef",3)
=> ["abc", "def"]
>> chunk("abcde",3)
=> ["abc", "de"]
>> chunk("abc",3)
=> ["abc"]
>> chunk("ab",3)
=> ["ab"]
>> chunk("",3)
=> []
如果您希望chunk("", n)
返回[""]
而不是[]
。那么,只需在方法的第一行添加以下内容:
return [""] if string.empty?
你会推荐更好的解决方案吗?
编辑
感谢Jeremy Ruten提供这个优雅而高效的解决方案:[编辑:不高效!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
编辑
使用string.scan的方法将512k的字符串分成10000个1k块需要约60秒,而原始的基于切片的解决方案只需要2.4秒。