我有一串非常长的数字(1000个字符)。我想将其分解为5个chuck并插入数组arr
。
str = "7316717653133062491922511967442657474206326239578318016 ..."
我尝试了each_slice
,但当我尝试require 'enumerator'
#=> irb说:false
str.each_slice(5).to_a
我希望输出看起来像:
arr = [ "73167", "17653", "33062", ... ]
如何实现这一目标?
答案 0 :(得分:10)
问题在于您尝试对不可枚举的对象(字符串)执行可枚举的方法。您可以尝试在字符串上使用scan
来查找5个组:
arr = str.scan /.{1,5}/
如果你想进入可枚举的路线,你可以先将字符串分解为一个字符数组,得到5个组,然后将它们连接成5个字符的字符串:
arr = str.chars.each_slice(5).map(&:join)
答案 1 :(得分:5)
不知道为什么你要求可枚举,它在ruby核心中并不需要被要求。
arr = []
until string.empty?
arr << string.slice!(0..4)
end
答案 2 :(得分:1)
我会去使用正则表达式。我认为 - 没有进行任何测试 - 它是一种更快的解决方案:
以下是一些代码:
2.0.0-p247 :001 > string = '1231249081029381028401982301984870895710394871023857012378401928374102394871092384710398275018923501892347'
=> "1231249081029381028401982301984870895710394871023857012378401928374102394871092384710398275018923501892347"
2.0.0-p247 :002 > string.scan(/\d{4}/)
=> ["1231", "2490", "8102", "9381", "0284", "0198", "2301", "9848", "7089", "5710", "3948", "7102", "3857", "0123", "7840", "1928", "3741", "0239", "4871", "0923", "8471", "0398", "2750", "1892", "3501", "8923"]
2.0.0-p247 :003 >
注意:我在我的例子中使用了4个字符而不是5个..但是你明白了。
答案 3 :(得分:0)
我会小心使用.chars
,因为它必须使用字符串的字符分配一个单独的数组。一般来说,我建议使用块(如果可用)或索引,因为它运行速度更快,内存更有效。在过去,我使用过具有以下块的拆分器:
def splitter(input, chunk_size = 2, &block)
(0..input.length/chunk_size - 1).each do |i|
yield input.slice(i * chunk_size, chunk_size) if block_given?
end
end
:008 > splitter("test\nwow") {|x| p x}
"te"
"st"
"\nw"
"ow"
=> 0..3