查找映射数据的最小值

Phr*_*ogz 3 ruby map

给定一组复杂对象,一个用于将每个映射到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)

Aar*_*n K 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
}
Run Code Online (Sandbox Code Playgroud)

如果您的对象已经是某种形式的数字,则可以省略Float::INFINITY.否则,为了确保我们只是比较数字值,您需要添加它.