给出这个示例数组:
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中最好的方法是什么?
答案 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 }