找到一个特定长度的字符串的最后一次出现

时间:2017-07-19 09:30:08

标签: ruby

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

def longest_word(string_of_words)
  x = string_of_words.split(" ").max_by(&:length)
end

但是,如果有多个长度最长的单词,我如何返回长度最长的单词的最后一个实例?有没有方法,我是否使用索引?

本杰明

6 个答案:

答案 0 :(得分:3)

如果我们利用reverse

会怎样?
"asd qweewe lol qwerty df qwsazx".split.reverse_each.max_by(&:length)
=> "qwsazx"

答案 1 :(得分:2)

在应用max_by之前,只需reverse您的单词数组。

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

答案 2 :(得分:1)

您可以使用inject,只有在(通过<=)匹配或改进时才会替换最大值。默认情况下,inject接收其接收者的第一个元素。

str.split.inject { |m,s| m.size <= s.size ?  s : m }

答案 3 :(得分:1)

也可以这样做:

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

注意:您可以在升序(默认)订单中split个字和sort之前的length获取{{} 1}}字

答案 4 :(得分:0)

max_by.with_index{|e, i| [e, i]}

答案 5 :(得分:0)

无需将字符串转换为数组。

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"

两点。

  • 我使用String#gsub创建了一个枚举器,用于将单词提供给Enumerable.#each_with_object。字符串参数未被修改。这是我gsub的常用用法,在某些情况下我可以使用它。
  • 在该区块内,必须使用longest.replace(s)而不是longest = s。这是因为each_with_object返回最初给定的对象(通常由块修改),但不会在每次迭代时更新该对象。 longest = s仅返回s(仅等于s),但不会更改块变量的值。相比之下,longest.replace(s)修改原始对象。

关于这两点中的第二点,有趣的是将each_with_objectEnumerable#reduce(又名inject)的使用进行对比。

  str.gsub(/[[:alpha:]]+/).
      reduce('') {|longest,s| s.size >= longest.size ? s : longest }
    #=> "swim"