假设我有以下数组:

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是一种非常面向对象的编程语言,可提供非常强大的工具供您使用。我彻底建议阅读一本书,例如“红宝石编程语言”或“红宝石方式”,以适当概述该语言的力量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top