如何根据使用min_by比较多个块来获取数组的最小值?

时间:2015-12-09 17:17:54

标签: ruby-on-rails arrays ruby

给出这个示例数组:

sizes = [35, 40, 45, 50, 55, 60]

这需要适合的尺寸:

fit_this = 30

我想根据这些给定的块找到最小尺寸:

sizes.min_by { |size| (size - fit_this).abs }   #=> 35
sizes.min_by { |size| (size - fit_this*2).abs } #=> 60

尺寸是宽度,我尝试将尽可能多的fit_this项目放入宽度最小的空间,因此fit_this数字可以加倍,如果& #39;更合适。

是否可以使用min_by执行此操作?如果没有,那么在Ruby中最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

让我们用min_by替换map检查中间数组:

sizes.map { |size| (size - fit_this).abs }
#=> [5, 10, 15, 20, 25, 30]

sizes.map { |size| (size - fit_this*2).abs }
#=> [25, 20, 15, 10, 5, 0]

我们可以通过返回逐元素数组来结合两种计算:

sizes.map { |size| [(size - fit_this).abs, (size - fit_this*2).abs] }
#=> [[5, 25], [10, 20], [15, 15], [20, 10], [25, 5], [30, 0]]

并使用min获取每对中较小的数字:

sizes.map { |size| [(size - fit_this).abs, (size - fit_this*2).abs].min }
#=> [5, 10, 15, 10, 5, 0]

适用于min_by

sizes.min_by { |size| [(size - fit_this).abs, (size - fit_this*2).abs].min }
#=> 60

答案 1 :(得分:0)

是的,我们可以做到。

基本思路是我们想要针对所有尺寸尝试两种情况并选择最适合的情况:

sizes.min_by { |size| [(size - fit_this).abs, (size - fit_this * 2).abs].min }