我构建了这个方法来查找数组中最长的单词,但我想知道是否有更好的方法来完成它。我是Ruby的新手,只是将其作为学习inject
方法的练习。
它返回数组中最长的单词,或者返回相同最长单词的数组。
class Array
def longest_word
# Convert array elements to strings in the event that they're not.
test_array = self.collect { |e| e.to_s }
test_array.inject() do |word, comparison|
if word.kind_of?(Array) then
if word[0].length == comparison.length then
word << comparison
else
word[0].length > comparison.length ? word : comparison
end
else
# If words are equal, they are pushed into an array
if word.length == comparison.length then
the_words = Array.new
the_words << word
the_words << comparison
else
word.length > comparison.length ? word : comparison
end
end
end
end
end
答案 0 :(得分:27)
我愿意
class Array
def longest_word
group_by(&:size).max.last
end
end
答案 1 :(得分:6)
Ruby有一个标准方法,用于返回列表中具有最大值的元素。
anArray.max{|a, b| a.length <=> b.length}
或者您可以使用max_by方法
anArray.max_by(&:length)
获取所有具有最大长度的元素
max_length = anArray.max_by(&:length).length
all_with_max_length = anArray.find_all{|x| x.length = max_length}
答案 2 :(得分:4)
这是一个使用inject
(对于空数组不起作用):
words.inject(['']){|a,w|
case w.length <=> a.last.length
when -1
a
when 0
a << w
when 1
[w]
end
}
可以缩短为
words.inject(['']){|a,w|
[a + [w], [w], a][w.length <=> a.last.length]
}
对于那些喜欢高尔夫的人。
答案 3 :(得分:2)
两个班轮:
vc = ['asd','s','1234','1235'].sort{|a,b| b.size <=> a.size}
vc.delete_if{|a| a.size < vc.first.size}
#Output
["1235", "1234"]
或者如果你想使用注入,这可以使用你的想法,但它更短。
test_array.inject{ |ret,word|
ret = [ret] unless ret.kind_of?(Array)
ret << word if word.size == ret.first.size
ret = [word] if word.size > ret.first.size
ret
}
答案 4 :(得分:1)
module Enumerable
def longest_word
(strings = map(&:to_s)).
zip(strings.map(&:length)).
inject([[''],0]) {|(wws, ll), (w, l)|
case l <=> ll
when -1 then [wws, ll]
when 1 then [[w], l]
else [wws + [w], ll]
end
}.first
end
end
此方法仅取决于通用的Enumerable
方法,没有任何Array
具体信息,因此我们可以将其提取到Enumerable
模块中,它也可用于Set
模块{1}}或Enumerator
s,而不只是Array
s。
答案 5 :(得分:0)
此解决方案使用inject方法在数组中累积最长的字符串,然后选择长度最长的字符串。
动物= [&#34;小鼠&#34;,&#34;猫&#34;,&#34;鸟&#34;,&#34;熊&#34;,&#34;驼鹿&#34; ]
animals.inject(Hash.new {| h,k | h [k] = []}){| acc,e | acc [e.size]&lt;&lt; Ë; acc} .sort.last [1]
返回: [&#34;鼠标&#34;,&#34;鼠标&#34;]