ruby 如何将字符串拆分为块?

b1payxdu  于 2022-12-29  发布在  Ruby
关注(0)|答案(5)|浏览(137)

我有一个很长的数字串(1000个字符)。我想把它分解成5个一组,然后插入到一个数组arr中。

str = "7316717653133062491922511967442657474206326239578318016 ..."

我尝试each_slice,但当我尝试require 'enumerator' #=〉*irb说:错误 *

str.each_slice(5).to_a

我希望输出如下所示:

arr = [ "73167", "17653", "33062", ... ]

如何才能做到这一点?

unftdfkk

unftdfkk1#

问题是你试图在一个非枚举对象(字符串)上执行一个枚举方法,你可以尝试在字符串上使用scan来查找5个元素的组:

arr = str.scan /.{1,5}/

如果你想走可枚举的路线,你可以先把字符串分解成一个字符数组,得到5个一组的数组,然后把它们重新组合成5个字符的字符串:

arr = str.chars.each_slice(5).map(&:join)
hvvq6cgz

hvvq6cgz2#

不知道你为什么需要枚举,它在ruby core中,不需要被要求。

arr = []
until string.empty?
  arr << string.slice!(0..4)
end
57hvy0tb

57hvy0tb3#

我会使用regexp。我认为- * 无需进行任何测试 * -这是一个更快的解决方案:
下面是一些代码:

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个。但是你明白我的意思了。

u3r8eeie

u3r8eeie4#

我会小心使用.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
kxxlusnw

kxxlusnw5#

我个人遵循了user8556428的思想,以避免大多数建议引入的昂贵的中间值,并避免修改输入字符串,我希望能够将其用作生成器(例如使用s.each_slice.with_index)。
我的用例实际上是关于字节的,而不是字符,在字符大小的情况下,strscan是一个很好的解决方案。

class String
    # Slices of fixed byte-length.  May cut multi-byte characters.
    def each_slice(n = 1000, &block)
        return if self.empty?

        if block_given?
            last = (self.length - 1) / n
            (0 .. last).each do |i|
                yield self.slice(i * n, n)
            end
        else
            enum_for(__method__, n)
        end
    end
end

相关问题