我有一个方法,按字母顺序对字符串向量进行排序,并返回第一个字符串" ***"在每个子串之间。
def two_sort(s)
x = s.split.sort_by(&:downcase).first
return x.gsub(//, '***')
end
问题' ***'出现在字符串之前和字符串之后。我只希望它在字母之间。这是如何用正则表达式完成的?
另外,为什么我在终端上工作时会得到这个错误未定义方法?
`two_sort': undefined method `split' for #<Array:0x005635bb9bdb78> (NoMethodError)
from `block in <main>'
from `block in describe'
from `measure'
from `describe'
from `<main>'
答案 0 :(得分:3)
解决问题的一种方法是将split x
转换为字符,然后join使用'***'
作为分隔符:
def two_sort(s)
x = s.split.sort_by(&:downcase).first
x.split(//).join('***')
end
你甚至可以将这两行组合起来,摆脱临时变量x
,让它更符合Ruby的精神:
def two_sort(s)
s.split.sort_by(&:downcase).first.split(//).join('***')
end
正如@gerry在评论中建议的那样,可以使用String#chars
代替split(//)
。我认为它稍快一些,看起来更容易阅读:
def two_sort(s)
s.split.sort_by(&:downcase).first.chars.join('***')
end
但对于大型输入字符串,String#chars
需要为1-char字符串进行大量分配,并且它可能比x.gsub(//, '***').sub(/\A\*\*\*/, '').sub(/\*\*\*\z/, '')
更慢并且需要更多内存(由@ m-simon-borg建议)。
@ cary-swoveland保持清醒,建议用最干净,最快捷的方式删除前导和尾随***
:x.sub(//,'***')[3..-4]
。
我认为最快的解决方案(也使用最少的内存)是:
def two_sort(s)
s.split.sort_by(&:downcase).first.gsub(//, '***')[3...-3]
end