如何使用Ruby查找最小/最大


414

我要使用min(5,10)Math.max(4,7)。在Ruby中是否有实现此功能的函数?

Answers:


722

你可以做

[5, 10].min

要么

[4, 7].max

它们来自Enumerable模块,因此包括其中的任何东西都Enumerable将具有可用的那些方法。

v2.4引入了own Array#minArray#max,它们比Enumerable的方法快得多,因为它们跳过了调用#each

@nicholasklick提到了另一个选项,Enumerable#minmax但是这次返回的数组[min, max]

[4, 5, 7, 10].minmax
=> [4, 10]

3
@kaz我不确定我是否理解您的评论。
Ziggy 2014年

3
@Kaz ...您知道std::max(4, 7)比“标点符号”还多[4, 7].max吗?
tckmn 2014年

3
@Doorknob您确实意识到std::max可以将其导入到您的命名空间中,因此它变为max(4, 7)。等待; 从上面看,我已经说过了。
卡兹(Kaz)2014年

18
标点符号不是这里的问题。要获得几个值的最大值的整个堆分配在这里是潜在的丑陋。
kdbanman 2015年

7
Ruby主要供程序员使用,而不供计算机使用。用Matz的话说:“我希望看到Ruby帮助世界上的每个程序员提高生产力,享受编程并感到幸福。这是Ruby语言的主要目的。” 那是来自Ruby上的Wikipedia页面。
编码


25

所有这些结果都会产生垃圾,热心地尝试处理两个以上的参数。我很想知道它们与好的'ol相比表现如何:

def max (a,b)
  a>b ? a : b
end

这是我对您问题的正式答复。


有一些谣言说Ruby 2.4正在优化[a,b].max,但是还不清楚它是否比上述实现更快。 blog.bigbinary.com/2016/11/17/…–
戴夫·莫尔斯

2
这是微优化,它们是如此之快,差异可以忽略不计,请参见基准:repl.it/@AndreFigueiredo/DearWeirdSweepsoftware
Andre Figueiredo

1
此分析是否考虑到在GC中花费的时间?
戴夫·莫尔斯

20

如果您需要查找哈希的最大值/最小值,则可以使用#max_by#min_by

people = {'joe' => 21, 'bill' => 35, 'sally' => 24}

people.min_by { |name, age| age } #=> ["joe", 21]
people.max_by { |name, age| age } #=> ["bill", 35]

20

除了提供的答案之外,如果要将Enumerable#max转换为可以调用变量数字或参数的max方法(如某些其他编程语言一样),则可以编写:

def max(*values)
 values.max
end

输出:

max(7, 1234, 9, -78, 156)
=> 1234

这会滥用splat运算符的属性来创建包含所有提供的参数的数组对象,如果未提供任何参数,则创建一个空数组对象。在后一种情况下,该方法将返回nil,因为在空数组对象上调用Enumerable#max返回nil

如果要在Math模块上定义此方法,则应做到这一点:

module Math
 def self.max(*values)
  values.max
 end
end

请注意,与三元运算符(?:)相比,Enumerable.max至少慢两倍。有关更简单,更快速的方法,请参见Dave Morse的答案


但是,重新打开标准类和模块是否被认为是不好的做法?
radiantshaw

-2
def find_largest_num(nums)
  nums.sort[-1]
end

排序以找到最大值/最小值是浪费的;找到最小值/最大值是O(n),而排序是O(n log(n))。
Itamar Mushkin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.