Arrays 在Ruby中对多维字符串频率数组排序

Arrays 在Ruby中对多维字符串频率数组排序,arrays,ruby,sorting,hash,Arrays,Ruby,Sorting,Hash,我必须向用户询问一个字符串,程序应该对该字符串进行排序,并将其转换为如下数组 [["Letter", frequence]] [["a", 4],["b", 3],["c",3]] 如果频率相等,则按字母顺序排列 我有这个密码 puts "Write what you want" text = gets.chomp text.downcase! words = text.split("") print words frequencies = Hash.new(0) words.each do

我必须向用户询问一个字符串,程序应该对该字符串进行排序,并将其转换为如下数组

[["Letter", frequence]]
[["a", 4],["b", 3],["c",3]]
如果频率相等,则按字母顺序排列

我有这个密码

puts "Write what you want"
text = gets.chomp
text.downcase!
words = text.split("")
print words
frequencies = Hash.new(0)
words.each do |word|
    frequencies[word] += 1
end
frequencies = frequencies.sort_by {|x,y| y}.reverse!
frequencies = frequencies.sort_by {|x| x[1]}
frequencies.each do |word, freq|
    puts word + " " + freq.to_s 
end
这应该起作用:

str = 'helloworld'
frequency_hash = str.downcase.each_char.with_object(Hash.new(0)) { |c,h| h[c] += 1 }
# => {"h"=>1, "e"=>1, "l"=>3, "o"=>2, "w"=>1, "r"=>1, "d"=>1}
frequency_hash.sort_by { |k,v| [-v, k] }
# => [["l", 3], ["o", 2], ["d", 1], ["e", 1], ["h", 1], ["r", 1], ["w", 1]]
我们首先使用:

然后应用:

但是,如果有选择,最好使用枚举器来避免创建临时数组

通过将枚举数转换为数组,可以看到枚举数的元素:

enum.to_a
  #=> ["b", "a", "b", "o", "o", "n"]
但我们不会那样做。接下来,我们在枚举器上调用:

h = enum.group_by(&:itself)
  #=> {"b"=>["b", "b"], "a"=>["a"], "o"=>["o", "o"], "n"=>["n"]} 
操作符
&
首先使用它将方法(Ruby 2.2+)转换为proc,然后调用proc

然后,我们使用块的形式:

{ |_,a| a.size }
要确定合并的两个哈希中存在的每个键的值(这里当然是每个键):

最后,提供所需的顺序:

g.sort_by { |c,f| [-f, c] }
  #=> [["b", 2], ["o", 2], ["a", 1], ["n", 1]] 

K、 如果你使用了
groupby
,我会使用你的解决方案。很好的解释。但是,这样,当有一个连接频率(OP在他的问题中提到)时,键不会按字母顺序排列。在当前的实现中,输入:
helloworld
将产生以下输出:
[“l”,3],“o”,2],“d”,1],“w”,1],“r”,1],“e”,1],“h”,1]
。但是,它应该是:
[[“l”,3],“o”,2],“d”,1],“e”,1],“h”,1],“r”,1],“w”,1]
。谢谢@KMRakibulIslam。我错过了对辅助排序键的引用。我修好了,但现在没那么有趣了。你的问题是什么?
enum.to_a
  #=> ["b", "a", "b", "o", "o", "n"]
h = enum.group_by(&:itself)
  #=> {"b"=>["b", "b"], "a"=>["a"], "o"=>["o", "o"], "n"=>["n"]} 
{ |_,a| a.size }
g = h.merge(h) { |_,a| a.size }
  # => {"b"=>2, "a"=>1, "o"=>2, "n"=>1} 
g.sort_by { |c,f| [-f, c] }
  #=> [["b", 2], ["o", 2], ["a", 1], ["n", 1]] 
mytext = "This is sample text to count all characters in string"
myhash = mytext.downcase.each_char.with_object({}) { |c,h| (h[c] = h.fetch(c,0) + 1) if c =~ /[a-z]/ }
>  myhash.sort_by{|k,v| v}.reverse
#=> [["t", 7], ["s", 5], ["i", 4], ["a", 4], ["e", 3], ["n", 3], ["r", 3], ["l", 3], ["c", 3], ["h", 2], ["o", 2], ["m", 1], ["u", 1], ["p", 1], ["x", 1], ["g", 1]]