我知道有一种方法可以找到数组中最大的字符串
def longest_word(string_of_words)
x = string_of_words.split(" ").max_by(&:length)
end
但是,如果有多个长度最长的单词,我如何返回长度最长的单词的最后一个实例?有没有方法,我是否使用索引?
本杰明
答案 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"
两点。
gsub
的常用用法,在某些情况下我可以使用它。longest.replace(s)
而不是longest = s
。这是因为each_with_object
返回最初给定的对象(通常由块修改),但不会在每次迭代时更新该对象。 longest = s
仅返回s
(仅等于s
),但不会更改块变量的值。相比之下,longest.replace(s)
修改原始对象。 关于这两点中的第二点,有趣的是将each_with_object
与Enumerable#reduce(又名inject
)的使用进行对比。
str.gsub(/[[:alpha:]]+/).
reduce('') {|longest,s| s.size >= longest.size ? s : longest }
#=> "swim"