【发布时间】:2010-10-19 18:11:24
【问题描述】:
我一直在寻找一种优雅而有效的方法,在 Ruby 中将字符串分块为给定长度的子字符串。
到目前为止,我能想到的最好的是:
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 切成 1k 块 10000 次大约需要 60 秒,而原始基于切片的解决方案仅需要 2.4 秒。
【问题讨论】:
-
您的原始解决方案尽可能高效和优雅:无需检查字符串的每个字符即可知道将其切入何处,也无需将整个内容转换为数组然后又回来了。