首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Ruby中,将字符串切成给定长度的块的最佳方法是什么?

在Ruby中,将字符串切成给定长度的块的最佳方法是什么?
EN

Stack Overflow用户
提问于 2009-04-16 01:06:50
回答 9查看 38.1K关注 0票数 97

我一直在寻找一种优雅而高效的方法,在Ruby中将字符串分成给定长度的子字符串。

到目前为止,我能想到的最好的结果是:

代码语言:javascript
复制
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)返回[""]而不是[]。如果是这样,只需添加以下内容作为该方法的第一行:

代码语言:javascript
复制
return [""] if string.empty?

你能推荐更好的解决方案吗?

编辑

感谢Jeremy Ruten这个优雅而高效的解决方案:编辑:效率不高!

代码语言:javascript
复制
def chunk(string, size)
    string.scan(/.{1,#{size}}/)
end

编辑

string.scan解决方案将512k分成1k块10000次需要大约60秒,而最初基于切片的解决方案只需要2.4秒。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-04-16 01:26:05

使用String#scan

代码语言:javascript
复制
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{4}/)
=> ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx"]
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,4}/)
=> ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx", "yz"]
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,3}/)
=> ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"]
票数 168
EN

Stack Overflow用户

发布于 2011-02-05 04:05:00

这是另一种方法:

代码语言:javascript
复制
"abcdefghijklmnopqrstuvwxyz".chars.to_a.each_slice(3).to_a.map {|s| s.to_s }

=> "abc","def","ghi","jkl","mno","pqr","stu","vwx","yz“

票数 20
EN

Stack Overflow用户

发布于 2015-07-26 22:00:09

我认为这是最有效的解决方案,如果你知道你的字符串是区块大小的倍数

代码语言:javascript
复制
def chunk(string, size)
    (string.length / size).times.collect { |i| string[i * size, size] }
end

而对于部件

代码语言:javascript
复制
def parts(string, count)
    size = string.length / count
    count.times.collect { |i| string[i * size, size] }
end
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/754407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档