如何“比较并找到最佳”的最佳实践

时间:2012-07-12 17:02:46

标签: ruby algorithm code-design

让我说我有这样的事情:

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,然后分配第一个值,然后只有当它更小时才应该采用它之后的每个值。

3 个答案:

答案 0 :(得分:3)

您正在寻找的是sort_by例程,以按照任意标准对对象列表进行排序:

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

您可能需要使用firstlast,具体取决于您是希望从最高到最低还是从最低到最高。

答案 1 :(得分: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 }

答案 2 :(得分:0)

根据标准,这看起来不像排序问题那么合适。

你正在寻找最小的值,没有必要有临时值(除非你有什么东西没告诉我们)。

简单地假设第一个值是最好的并继续检查。

best_value = array[0];
foreach( element in array )
{
    if( best_value > element )
        best_value = element;
}