如何按字频排序,然后在Ruby中的每个频率内按字母顺序排序?

时间:2014-11-18 14:54:32

标签: ruby sorting word frequency

wordfrequency = Hash.new(0)
splitfed.each { |word| wordfrequency[word] += 1 }

wordfrequency = wordfrequency.sort_by {|x,y| y }
wordfrequency.reverse!

puts wordfrequency

我已经将这些单词添加到哈希表中并按字频进行排序,但是当我希望它按字母顺序排列时,每个频率内的顺序是随机的。任何快速修复?谢谢!非常感谢。

3 个答案:

答案 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]]