Ruby 中有平局时如何获得特定的最大值

How to get a specific max value when there are ties in Ruby

几周前我才开始学习Ruby,所以很抱歉我是个菜鸟。我正在编写一个简单的程序,它将根据数字的总和找到最大的 phone 数字输入。这是我目前所拥有的:

print 'Enter phone numbers'
phone_numbers = (gets.chomp)
phone_array = phone_numbers.split(",")

values = Hash.new(0)

phone_array.each { |x| values[x] += x.delete('-').to_s.split('').map(&:to_i).inject(:+)}

values.each { |k, v| puts k if v == values.values.max }

我的问题是:如果最大值相等,我如何让 ruby 给我对应于特定最大值的 phone 数字?我希望打破平局的策略是最后遇到的最大值。例如,如果我输入 111-111-1112,111-111-1121,我希望输出为 111-111-1121.

因为您只想要一个 phone 个数字(具有最大值),break 当找到一个时:

max_value = values.values.max   #store the max value to prevent computing it multiple times
values.each { |k, v| puts k; break if v == max_value }
#                            ^^^^^ 
phone_array.max_by { |phone_number| phone_number.scan(/\d/).map(&:to_i).reduce(:+) }

将 return 数字总和最大的 phone 数字。

如果有联系,第一项应该 returned。

这个解决方案 returns 一个包含最大数字总和的数组和一个包含所有 phone 数字总和等于最大值的数字的数组(按照它们在字符串中出现的顺序) :

str = " 111-111-1112, 111-111-1111,111-111-1121"

str.gsub(/\s/,'').
    split(/\s*,\s*/).
    each_with_object(Hash.new { |h,k| h[k]=[] }) do |s,h|
      h[s.each_char.reduce(0) { |t,c| t+c.to_i }] << s
    end.
    max_by(&:last)
  #=> [11, ["111-111-1112", "111-111-1121"]] 

注意'-'.to_i #=> 0