【问题标题】:How to sort by value in hash?如何按哈希值排序?
【发布时间】:2019-09-20 00:10:07
【问题描述】:

所以我制作了一个随机数生成器,它应该计算数字的频率并按排序顺序显示它们。我正在尝试使用 .sort 但我无法弄清楚将它放在哪里以按顺序对哈希值进行排序。到目前为止我所拥有的:

MIN_VALUE = 1
count = 0


puts "Enter a number of random integers to generate"
resp = gets.to_i
p "number of integers generated is #{resp}"


puts "Now enter the maximum value the integers can be"
max_value = gets.to_i
p "max value is set to #{max_value}"


size = Array.new(resp)


while (count < resp)

        int_value = (rand(MIN_VALUE..max_value))
        size.push(int_value)
        count = count + 1

end


puts size



freq = Hash.new(0)
size.each { |x| freq[x] += 1 }
freq.map{ |key, value| "#{key}x#{value}" }.join(',')



freq.each do |key,value|
        puts "Frequency of #{key} is: #{value}"

end

非常感谢任何帮助!

【问题讨论】:

标签: ruby


【解决方案1】:

或多或少相同的汤,在Integer#times 循环中生成随机数:

upper_number = 10
sample_size = 100

freq = Hash.new(0) # initializing the hash with a default value of zero, for counting
sample_size.times { freq[rand((1..upper_number))] += 1 } # here the loop generating and counting
freq #=> {5=>13, 7=>10, 1=>11, 2=>13, 8=>13, 9=>6, 3=>6, 6=>9, 10=>11, 4=>8}

然后可以按频率排序(倒序:-v)和按样本值排序(k),[-v, k]

freq.sort_by{ |k, v| [-v, k] }.to_h #=> {2=>13, 5=>13, 8=>13, 1=>11, 10=>11, 7=>10, 6=>9, 4=>8, 3=>6, 9=>6} # for this run
freq.sum { |_, v| v} #=> 100 # of course

【讨论】:

    【解决方案2】:

    假设

    arr = [4, 1, 3, 4, 2, 5, 1, 3, 4, 3, 4] 
    

    您可以使用Hash::new 的形式,它接受一个参数,称为它的默认值(通常,就像这里一样,为零),以获得arr 元素的频率:

    freq = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
      #=> {4=>4, 1=>2, 3=>3, 2=>1, 5=>1}
    

    我们看到了

    freq[1]
      #=> 2       
    freq[99]
      #=> 0
    

    第二个结果如下,因为freq 被定义为具有默认值0。这意味着如果freq 没有密钥kfreq[k] 返回零(这不会改变freq)。

    以下是对您问题的两种可能解释的解决方案。两者都使用方法Enumerable#sort_by

    按频率递减对arr的唯一值进行排序

    freq.sort_by { |_,v| -v }.map(&:first)
      #=> [4, 3, 1, 2, 5] 
    

    按频率递减对arr的值进行排序

    arr.sort_by { |n| -freq[n] }
      #=> [4, 4, 4, 4, 3, 3, 3, 1, 1, 2, 5] 
    

    -v-freq[n] 替换为vfreq[n] 以按频率递增排序。

    我在第一个解释中使用了局部变量_ 来表示键,以表示它不用于块计算。这是常见的做法。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 2016-11-21
      • 2011-07-07
      • 2017-03-24
      • 1970-01-01
      • 2011-03-10
      相关资源
      最近更新 更多