给定一系列复杂对象,一个用于将每个映射到Comparable值的算法,以及找到最小值的愿望,是一个内置库方法这将在一次通过中做到这一点?
有效但不是完美有效的解决方案:
# Iterates through the array twice
min = objects.map{ |o| make_number o }.min
# Calls make_number one time more than is necessary
min = make_number( objects.min_by{ |o| make_number o } )
高效但冗长的解决方案:
min = nil
objects.each{ |o| n=make_number(o); min=n if !min || n<min }
答案 0 :(得分:5)
不,不存在此类库方法。
我真的没有看到两个原始解决方案中的任何一个问题。枚举器代码用C语言编写,通常非常快。您始终可以对其进行基准测试,并查看特定数据集和代码的最快速度(尝试https://github.com/acangiano/ruby-benchmark-suite)
但是,如果您确实需要一次通过,则可以使用#each
简化#reduce
版本:
min = objects.reduce(Float::INFINITY){ |min, o|
n = make_number(o)
min > n ? n : min
}
如果您的对象已经是某种形式的数字,则可以省略Float::INFINITY
。否则,为了确保我们只是比较数字值,您需要添加它。