如何优化将字符串转换为相邻重叠两位整数数组的实现?
字符串滑动分割转数组的优化实现
现有字符串
key = "41521",需将其转换为数组array = [41, 15, 52, 21]。当前实现代码如下:array = [] array << key[0..1].to_i array << key[1..2].to_i array << key[2..3].to_i array << key[3..4].to_i请问是否存在更优的实现方式?
当然有更简洁、更符合Ruby风格的实现方式啦!给你分享几种常用的优化方案:
方法1:用each_cons实现(最推荐的Ruby风格)
Ruby的Enumerable#each_cons天生就是为这种滑动窗口取连续元素的场景设计的,代码简洁又易读:
key = "41521" array = key.chars.each_cons(2).map { |a, b| (a + b).to_i } # 输出结果:[41, 15, 52, 21]
简单解释下步骤:
key.chars把字符串拆成单个字符的数组:["4","1","5","2","1"]each_cons(2)会依次取出数组中连续的2个元素,生成["4","1"]、["1","5"]这类子数组- 最后用
map把每个子数组的两个字符拼接成字符串,再转成整数,一步到位生成目标数组。
方法2:正则表达式匹配
如果你习惯用正则,也可以用String#scan配合正向预查来实现滑动匹配:
key = "41521" array = key.scan(/(?=(\d{2}))/).flatten.map(&:to_i) # 输出结果:[41, 15, 52, 21]
这里的正则(?=(\d{2}))是正向预查,会逐个匹配字符串中每个位置后面的两位数字,scan会捕获所有符合条件的两位组合,最后转成整数数组即可。
方法3:基于索引的简洁写法
如果还是想基于索引操作,但不想重复写<<,可以用范围遍历一次性生成数组:
key = "41521" array = (0...key.length-1).map { |i| key[i, 2].to_i } # 输出结果:[41, 15, 52, 21]
(0...key.length-1)生成了所有需要的起始索引(0到3),key[i, 2]表示从索引i开始取2个字符,和key[i..i+1]效果一致,但写法更简洁。
这些方案的优势在于:
- 符合DRY原则,没有重复的代码片段
- 扩展性强:如果字符串长度变化(比如变成6位),不需要手动修改代码,会自动适配生成对应数量的元素
内容的提问来源于stack exchange,提问作者user6820969
相关产品推荐
相关产品推荐

