数组中最长的项目

时间:2010-05-07 22:13:36

标签: ruby

是否有比下面更简单的方法来找到数组中最长的项目?

arr = [
    [0,1,2],
    [0,1,2,3],
    [0,1,2,3,4],
    [0,1,2,3]
]

longest_row = []
@rows.each { |row| longest_row = row if row.length > longest_row.length }

p longest_row # => [0,1,2,3,4]

3 个答案:

答案 0 :(得分:19)

编辑:以前的版本有点不对,版本号不清楚

从Ruby版本1.9和1.8.7+开始,Enumerable#max_by方法可用:

@rows = arr.max_by{|a| a.length}

max_by为arr中的每个对象执行给定的块,然后返回具有最大结果的对象。

在这种简单的情况下,块只包含一个方法名称和一些可变噪声,实际上不需要显式块。可以使用Symbol#to_proc方法并完全避免使用块变量,这样做:

@rows = arr.max_by(&:length)

早期版本的Ruby缺少#to_proc#max_by方法。因此,我们需要明确地给出我们的实际比较并使用Enumerable#max

@rows = arr.max{|c1, c2| c1.length <=> c2.length} 

感谢所有评论澄清。

答案 1 :(得分:1)

arr.inject {|最长,电流|最长的长度> current.length?最长的:当前的}

答案 2 :(得分:0)

您可以根据长度对数组进行排序,然后拉长时间。

sorted_rows = @rows.sort{|x,y| y.length<=>x.length}
longest_row = sorted_rows.first

效率不高,但它是另一种选择。如果您不想使用新数组并且不关心@rows数组中的排序,您可以使用排序!方法