wordfrequency = Hash.new(0)
splitfed.each { |word| wordfrequency[word] += 1 }
wordfrequency = wordfrequency.sort_by {|x,y| y }
wordfrequency.reverse!
puts wordfrequency
我已经将这些单词添加到哈希表中并按字频进行排序,但是当我希望它按字母顺序排列时,每个频率内的顺序是随机的。任何快速修复?谢谢!非常感谢。
答案 0 :(得分:2)
您可以使用:
wordfrequency = wordfrequency.sort_by{|x,y| [y, x] }
按值排序,然后按键。
在你的情况下,
splitfed = ["bye", "hi", "hi", "a", "a", "there", "alphabet"]
wordfrequency = Hash.new(0)
splitfed.each { |word| wordfrequency[word] += 1 }
wordfrequency = wordfrequency.sort_by{|x,y| [y, x] }
wordfrequency.reverse!
puts wordfrequency.inspect
将输出:
[["hi", 2], ["a", 2], ["there", 1], ["bye", 1], ["alphabet", 1]]
通过单词本身的出现而反向排序。
请务必注意(可能很明显)wordfrequency现在是一个数组。
答案 1 :(得分:1)
哈希不一定按自然顺序排序;它取决于个人数据结构。如果你想打印一个哈希,你需要对键进行排序,然后遍历那个排序的键列表,输出每个键的值。
您可以在一行上执行此操作,或者将哈希中的条目收集到已排序的数组数组中,但最终它们都会返回对键进行排序,然后检索已排序键列表的数据
一些哈希维护插入顺序,一些哈希维护一个排序结构,然后您可以在处理哈希时遍历,但这些是规则的例外。
答案 2 :(得分:0)
Ruby的group_by
是此基础:
words = %w[foo bar bar baz]
words.group_by{ |w| w }
# => {"foo"=>["foo"], "bar"=>["bar", "bar"], "baz"=>["baz"]}
words.group_by{ |w| w }.map{ |k, v| [k, v.size ] }
# => [["foo", 1], ["bar", 2], ["baz", 1]]
如果您想根据频率按字词排序:
words.group_by{ |w| w }.map{ |k, v| [k, v.size ] }.sort_by{ |k, v| [k, v] }
# => [["bar", 2], ["baz", 1], ["foo", 1]]
如果您想按频率排序,请按以下字词排序:
words.group_by{ |w| w }.map{ |k, v| [k, v.size ] }.sort_by{ |k, v| [v, k] }
# => [["baz", 1], ["foo", 1], ["bar", 2]]