如何在Ruby中存在关联时获取特定的最大值

时间:2015-05-26 17:23:29

标签: ruby max

几周前我刚开始学习Ruby,所以我为成为一个完整的菜鸟而道歉。我正在写一个简单的程序,它会根据数字的总和找到最大的电话号码输入。以下是我到目前为止的情况:

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 }

我的问题是:如果最大值相等,我如何让红宝石给我一个与特定最大值相对应的电话号码?我希望打破平局策略是遇到的最后一个最大值。例如,如果我输入111-111-1112,111-111-1121,我希望输出为111-111-1121。

3 个答案:

答案 0 :(得分:1)

由于您只需要一个电话号码(最大值),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 }
#                            ^^^^^ 

答案 1 :(得分:0)

phone_array.max_by { |phone_number| phone_number.scan(/\d/).map(&:to_i).reduce(:+) }

将返回最大数字总和的电话号码。

如果有领带,则应退回第一项。

答案 2 :(得分:0)

此解决方案返回一个数组,其中包含最大数字总和以及所有电话号码的数组,其数字总和等于最大值(按照它们在字符串中出现的顺序):

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