方法.gsub没有返回所需的字符串

时间:2017-07-19 13:20:43

标签: ruby

我有一个方法,按字母顺序对字符串向量进行排序,并返回第一个字符串" ***"在每个子串之间。

def two_sort(s)
  x = s.split.sort_by(&:downcase).first
  return x.gsub(//, '***')  
end
  1. 问题' ***'出现在字符串之前和字符串之后。我只希望它在字母之间。这是如何用正则表达式完成的?

  2. 另外,为什么我在终端上工作时会得到这个错误未定义方法?

  3. `two_sort': undefined method `split' for #<Array:0x005635bb9bdb78> (NoMethodError)
    from `block in <main>'
    from `block in describe'
    from  `measure'
    from  `describe'
    from  `<main>'
    

1 个答案:

答案 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