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
。
几周前我才开始学习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
。