让我说我有这样的事情:
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,然后分配第一个值,然后只有当它更小时才应该采用它之后的每个值。
答案 0 :(得分:3)
您正在寻找的是sort_by
例程,以按照任意标准对对象列表进行排序:
best = array.sort_by do |element|
function_does_something_complex_and_returns_value(element)
end.first
您可能需要使用first
或last
,具体取决于您是希望从最高到最低还是从最低到最高。
答案 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;
}