题
假设我有以下数组:
arr = [[5, 1], [2, 7]]
我想找到最小元素,比较元素的第二个元素。最小元素将是 [5, 1]
自从 1
小于 7
. 。我可以使用以下代码:
arr.min {|a,b| a[1] <=> b[1]}
为了计算最大值,我可以做同样的事情:
arr.max {|a,b| a[1] <=> b[1]}
那给了 [2, 7]
.
我一直在使用相同的块。我想在某个地方放置该块,并将其提供给最小/最大功能。我希望像:
blo = lambda {|a,b| a[1] <=> b[1]}
arr.min blo
会起作用,但事实并非如此。关于我该怎么做的任何想法吗?
解决方案
使用 &
操作员转动 Proc
对象进入一个块。
arr.min &blo
其他提示
@sepp2k的答案是越笼统的,但是在您的具体情况下,我只会使用
arr.min_by(&:last)
arr.max_by(&:last)
因为那是 很多 比所有那些卷曲的括号,方括号和阵列指数更为明显。
如果您需要的所有最小和最大值,则可以使用 Enumerable#minmax
方法并立即计算两者:
min, max = arr.minmax {|a,b| a[1] <=> b[1]}
#=> [[5, 1], [2, 7]]
min
#=> [5, 1]
max
#=> [2, 7]
编辑:地狱,我只是注意到也有 minmax_by
, ,因此您可以将其结合在一起 last
方法,并且有:
min, max = arr.minmax_by &:last
这个怎么样?
=> [[5, 4], [9, 5], [2, 7]]
>> arr.sort!{|x,y| x[1]<=>y[1] }
=> [[5, 4], [9, 5], [2, 7]]
>> min,max=arr[0],arr[-1]
=> [[5, 4], [2, 7]]
解决此类问题的更一般的解决方案是避免完全嵌套数组并使用类。然后,您可以定义该课程的<=>操作员,使您可以访问可比较的Mixin(http://ruby-doc.org/core/classes/classes/comparable.html)中的所有功能。 ,==,> =和>运算符以及“之间?”之间的方法。
这只是一个例子,在现实生活中,您将使用描述他们存储的内容的课程:
class Duo
include Comparable
def initialize( a, b )
@a = a
@b = b
end
def <=>(rhs)
@b <=> rhs.b
end
end
如果您有二人组对象数组,则可以使用最小,最大和排序功能,而无需定义比较操作员。所以...
@a = Duo.new( 1, 10 )
@b = Duo.new( 2, 5 )
@c = Duo.new( 3, 1 )
[ @a, @b, @c ].sort
会返回数组[@c,@b,@a
和
[@a, @b, @c].max
会返回 @a
这比具有逻辑的嵌套数据结构更为“ Ruby方法”,该层次依赖于数组中的位置。一开始需要花费更多的工作,但是您会发现它 很多 从长远来看,更好。
Ruby是一种非常面向对象的编程语言,可提供非常强大的工具供您使用。我彻底建议阅读一本书,例如“红宝石编程语言”或“红宝石方式”,以适当概述该语言的力量。