给定一组复杂对象,一个用于将每个映射到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 } )
Run Code Online (Sandbox Code Playgroud)
高效但冗长的解决方案:
min = nil
objects.each{ |o| n=make_number(o); min=n if !min || n<min }
Run Code Online (Sandbox Code Playgroud)
不,没有这样的库方法已经存在.
我没有看到您的两个原始解决方案中的任何一个问题.枚举器代码用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
}
Run Code Online (Sandbox Code Playgroud)
如果您的对象已经是某种形式的数字,则可以省略Float::INFINITY.否则,为了确保我们只是比较数字值,您需要添加它.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |