Vin*_*ent 249 ruby sorting hashmap
这是排序哈希并返回哈希对象(而不是数组)的最佳方法:
h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
# => {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
Hash[h.sort]
# => {"a"=>1, "b"=>2, "c"=>3, "d"=>4}
Run Code Online (Sandbox Code Playgroud)
Pet*_*ter 80
注意:Ruby> = 1.9.2有一个保持顺序的哈希:插入的顺序键将是它们被枚举的顺序.以下内容适用于旧版本或向后兼容代码.
没有排序哈希的概念.所以不,你正在做的事情是不对的.
如果要对其进行排序以显示,请返回一个字符串:
"{" + h.sort.map{|k,v| "#{k.inspect}=>#{v.inspect}"}.join(", ") + "}"
Run Code Online (Sandbox Code Playgroud)
或者,如果您想要按键顺序:
h.keys.sort
Run Code Online (Sandbox Code Playgroud)
或者,如果要按顺序访问元素:
h.sort.map do |key,value|
# keys will arrive in order to this block, with their associated value.
end
Run Code Online (Sandbox Code Playgroud)
但总的来说,谈论排序的哈希是没有意义的.从文档中,"通过键或值遍历散列的顺序可能看起来是任意的,并且通常不会处于插入顺序中." 因此,按特定顺序将密钥插入哈希将无济于事.
bou*_*uby 63
我一直都在用sort_by
.您需要包装#sort_by
输出Hash[]
以使其输出散列,否则它将输出数组数组.或者,要完成此操作,您可以#to_h
在元组数组上运行该方法,将它们转换为k=>v
结构(哈希).
hsh ={"a" => 1000, "b" => 10, "c" => 200000}
Hash[hsh.sort_by{|k,v| v}] #or hsh.sort_by{|k,v| v}.to_h
Run Code Online (Sandbox Code Playgroud)
" 如何按数值排序Ruby Hash? "中有类似的问题.
fl0*_*00r 13
不,它不是(Ruby 1.9.x)
require 'benchmark'
h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
many = 100_000
Benchmark.bm do |b|
GC.start
b.report("hash sort") do
many.times do
Hash[h.sort]
end
end
GC.start
b.report("keys sort") do
many.times do
nh = {}
h.keys.sort.each do |k|
nh[k] = h[k]
end
end
end
end
user system total real
hash sort 0.400000 0.000000 0.400000 ( 0.405588)
keys sort 0.250000 0.010000 0.260000 ( 0.260303)
Run Code Online (Sandbox Code Playgroud)
对于大哈希,差异将增长到10倍甚至更多
Bor*_*cky 12
你在OP中给出了自己最好的答案:Hash[h.sort]
如果你渴望更多的可能性,这里就是对原始哈希进行原位修改以使其排序:
h.keys.sort.each { |k| h[k] = h.delete k }
Run Code Online (Sandbox Code Playgroud)
如果您不想使用ruby 1.9.2或推出自己的解决方法,ActiveSupport :: OrderedHash是另一种选择.
按键对哈希排序,在Ruby中返回哈希
使用解构和Hash#sort
hash.sort { |(ak, _), (bk, _)| ak <=> bk }.to_h
Run Code Online (Sandbox Code Playgroud)
Enumerable#sort_by
hash.sort_by { |k, v| k }.to_h
Run Code Online (Sandbox Code Playgroud)
Hash#sort具有默认行为
h = { "b" => 2, "c" => 1, "a" => 3 }
h.sort # e.g. ["a", 20] <=> ["b", 30]
hash.sort.to_h #=> { "a" => 3, "b" => 2, "c" => 1 }
Run Code Online (Sandbox Code Playgroud)
注意:<Ruby 2.1
array = [["key", "value"]]
hash = Hash[array]
hash #=> {"key"=>"value"}
Run Code Online (Sandbox Code Playgroud)
注意:> Ruby 2.1
[["key", "value"]].to_h #=> {"key"=>"value"}
Run Code Online (Sandbox Code Playgroud)