3

给定一个复杂对象的数组,一个将每个对象映射到 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 }
4

1 回答 1

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. 否则,为了确保我们只比较数字值,您需要添加它。

于 2013-05-10T16:10:41.457 回答