Ruby中最长的单词

时间:2011-03-06 19:55:34

标签: ruby enumerable inject

我构建了这个方法来查找数组中最长的单词,但我想知道是否有更好的方法来完成它。我是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

6 个答案:

答案 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;]