【问题标题】:Taking a string, reversing the letter in each word while leaving the word in its original position取一个字符串,反转每个单词中的字母,同时将单词留在其原始位置
【发布时间】:2018-06-14 11:58:18
【问题描述】:

我正在尝试取一个句子,并颠倒每个单词中字母的位置。

下面是我的代码不起作用:

def test(sentence)
 array = []
 array << sentence.split
 array.collect {|word| word.reverse}
end

我的问题是:

array << sentence.split

它说它划分了每个单词,但是当我使用插值时,它会反转整个句子。下面是一个类似的代码:

def test2
 dog = ["Scout", "kipper"]
 dog.collect {|name| name.reverse}
end

但是它不接受一个句子,并且它已经定义了数组。

【问题讨论】:

  • 例如“Hello World”->“olleH dlroW”
  • "Hello, how are you?" 会返回什么?

标签: arrays ruby reverse string-interpolation


【解决方案1】:

我在想你想拆分,然后将数组的每个元素映射到它的反转版本,然后将数组重新加入一个字符串:

def test(sentence)
  sentence.split.map {|word| word.reverse}.join(" ")
end

使用 symbol-to-proc 更简洁(信用 @MarkThomas in cmets)

sentence.split.map(&amp;:reverse).join " "

【讨论】:

  • 我需要在这个问题中使用 .collect ,以及你对最后加入的权利,我还没有让单词反转所以还没有包括在内哈哈。我觉得我的分裂并没有真正分裂单词。我一直得到这个作为回报 [["Hello" "World"]]
  • 抱歉这里删除了评论,这是误导(我记错了一些 ruby​​ 细节)。似乎collectmap 基本相同(详情:stackoverflow.com/a/5254764/13956)所以您可以将上述答案中的mapcollect 交换。
  • split 不是在这里创建嵌套数组的原因,它为您提供了一个数组。嵌套来自使用&lt;&lt; 将数组作为元素附加到您使用array = [] 创建的另一个数组中。 (也就是说:你实际上是在做[] &lt;&lt; ["Hello", "World"],这给了[["Hello", "World"]]。)
  • 更简洁:sentence.split.map(&amp;:reverse).join " "
  • @MarkThomas Darn,你短了一个字符...sentence.reverse.split.reverse.join " "。另一方面,我的似乎有点快...
【解决方案2】:

与将句子分解为单词、反转每个单词然后重新连接它们的方法不同,将Array#gsub 与正则表达式一起使用会保留非单词字符(例如下面示例中的逗号)和多个空格。

"vieille, mère    Hubbard".gsub(/\b\p{L}+\b/, &:reverse)
  #=> "ellieiv, erèm    drabbuH"

【讨论】:

    【解决方案3】:
    def reverse(str)
      str.split.map { |s| s.length < 5 ? s : s.reverse }.join(' ')
    end
    puts reverse ("this is a catalogy")
    

    这应该将每个长度最多为 5 的单词反转

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多