0

假设我有这样的事情:

def find_the_best(array)
  temp = 15435435435 # sufficiently large number
  value = 0
  array.each do |element|
    some_var = function_does_something_complex_and_returns_value(element)
    some_var < temp ? value = element[0]
  end
end

这个足够大的数字解决方案有效,但它似乎有点 hacky。处理这个问题的最佳方法是什么,特别是在红宝石中,但通常也是如此。问题是它确实应该设置为 0,然后分配第一个值,然后只有当它更小时才应该采用之后的每个值。

4

3 回答 3

3
array.min_by{|e| function_does_something_complex_and_returns_value(e) }

或者

array.inject {|m,e| [m, function_does_something_complex_and_returns_value(e)].min }
于 2012-07-12T17:14:32.370 回答
3

您正在寻找的是sort_by通过一些任意标准对对象列表进行排序的例程:

best = array.sort_by do |element|
  function_does_something_complex_and_returns_value(element)
end.first

您可能需要使用firstor ,last具体取决于您想要从最高到最低还是从最低到最高。

于 2012-07-12T17:10:18.487 回答
0

这看起来不像是一个排序问题,而是基于标准的最佳拟合。

您正在寻找最小值,不需要有 temp 值(除非您没有告诉我们某些事情)。

只需假设第一个值将是最好的,然后继续检查。

best_value = array[0];
foreach( element in array )
{
    if( best_value > element )
        best_value = element;
}
于 2012-07-12T17:46:33.190 回答