Ruby 查找具有特定长度的字符串的最后一次出现

Ruby 查找具有特定长度的字符串的最后一次出现,ruby,Ruby,我知道有一种方法可以找到数组中最大的字符串 def longest_word(string_of_words) x = string_of_words.split(" ").max_by(&:length) end 但是,如果有多个最长的单词,如何返回最长单词的最后一个实例?有方法吗?我是否使用索引 Benjamin在应用max\u by之前,只需简单地输入单词数组即可 反向数组中的第一个最长单词将是句子中的最后一个单词。在应用max\u by之前,只需简单地使用单词数组即可 倒序

我知道有一种方法可以找到数组中最大的字符串

def longest_word(string_of_words)
  x = string_of_words.split(" ").max_by(&:length)
end
但是,如果有多个最长的单词,如何返回最长单词的最后一个实例?有方法吗?我是否使用索引

Benjamin

在应用max\u by之前,只需简单地输入单词数组即可

反向数组中的第一个最长单词将是句子中的最后一个单词。

在应用max\u by之前,只需简单地使用单词数组即可


倒序数组中的第一个最长单词将是您句子中的最后一个。

如果我们利用倒序怎么办


如果我们利用反向呢

您可以使用inject,它将仅在via时替换最大值。您可以使用inject,它将仅在via也可以这样做时替换最大值:

 > "asd qweewe lol qwerty df qwsazx".split.sort_by(&:length).last
 #=> "qwsazx"
注意:您可以按升序默认顺序拆分单词和按长度排序,并取最后一个单词

 > "asd qweewe lol qwerty df qwsazx".split.sort_by(&:length).last
 #=> "qwsazx"

注意:您可以按升序默认顺序拆分单词和按长度排序,并取最后一个单词,无需将字符串转换为数组

def longest_word(str)
  str.gsub(/[[:alpha:]]+/).
      each_with_object('') {|s,longest| longest.replace(s) if s.size >= longest.size}
end

longest_word "Many dogs love to swim in the sea"
  #=> "swim"
两点

我曾经创建过一个枚举器,它将单词输入到。未修改字符串参数。这是gsub的一个常用用法,我已经能够在几种情况下利用它。 在块中,有必要使用longest.replaces而不是longest=s。这是因为每个带有对象的对象返回通常由块修改的原始给定对象,但不会在每次迭代中更新该对象。longest=s仅返回s,s仅相当于s,但不改变块变量的值。相比之下,longest.replaces会修改原始对象。 关于这两点中的第二点,有趣的是将每个_与带有aka inject的_对象的用法进行对比


不需要将字符串转换为数组

def longest_word(str)
  str.gsub(/[[:alpha:]]+/).
      each_with_object('') {|s,longest| longest.replace(s) if s.size >= longest.size}
end

longest_word "Many dogs love to swim in the sea"
  #=> "swim"
两点

我曾经创建过一个枚举器,它将单词输入到。未修改字符串参数。这是gsub的一个常用用法,我已经能够在几种情况下利用它。 在块中,有必要使用longest.replaces而不是longest=s。这是因为每个带有对象的对象返回通常由块修改的原始给定对象,但不会在每次迭代中更新该对象。longest=s仅返回s,s仅相当于s,但不改变块变量的值。相比之下,longest.replaces会修改原始对象。 关于这两点中的第二点,有趣的是将每个_与带有aka inject的_对象的用法进行对比


我有点困惑“反向”方法如何找到最长单词的最后一个实例?max_by发现了这一点。但是第一个。因此,首先,我们反转数组。我有点困惑“反转”方法如何找到最长单词的最后一个实例?max_by发现了这一点。但是第一个。首先,我们反转数组,这是因为sort\u by是一个稳定的排序。同样,这是因为sort\u by是一个稳定的排序。这不起作用。例如,尝试使用字符串asd qweewe lol qwerty df qwsazx hellos。为了使您的答案适用于此网站,您最好解释您的解决方案,而不是仅仅发布代码。我相信sawa的意思是用max_by替换OP代码中的max_by&:length,并使用{u index{e,I{e.length,I]}。sawa注意到了遗漏。这样,如果两个词的长度相同,则与索引较大的词相匹配。有关Ruby如何对数组进行排序的解释,请参见文档的第三段。这不起作用。例如,尝试使用字符串asd qweewe lol qwerty df qwsazx hellos。为了使您的答案适用于此网站,您最好解释您的解决方案,而不是仅仅发布代码。我相信sawa的意思是用max_by替换OP代码中的max_by&:length,并使用{u index{e,I{e.length,I]}。sawa注意到了遗漏。这样,如果两个词的长度相同,则与索引较大的词相匹配。请参阅文档的第三段,了解Ruby如何排序数组。
def longest_word(str)
  str.gsub(/[[:alpha:]]+/).
      each_with_object('') {|s,longest| longest.replace(s) if s.size >= longest.size}
end

longest_word "Many dogs love to swim in the sea"
  #=> "swim"
  str.gsub(/[[:alpha:]]+/).
      reduce('') {|longest,s| s.size >= longest.size ? s : longest }
    #=> "swim"