Как отсортировать по значению в хэше? - PullRequest
2 голосов
/ 20 сентября 2019

Итак, я сделал генератор случайных чисел, который должен считать частоту чисел и отображать их в отсортированном порядке.Я пытаюсь использовать .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

Любая помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Более или менее один и тот же суп, генерирующий случайные числа в цикле 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
0 голосов
/ 20 сентября 2019

Предположим,

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 не имеет ключа k, freq[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] на v и freq[n] для сортировки по возрастанию частоты.

IИспользовал локальную переменную _ для представления ключей в первой интерпретации, чтобы показать, что она не используется в расчете блока.Это обычная практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...