今天有个需求,将存在redis hash结构中的数据进行排序(热门搜索词,存于redis hash中) 所以就涉及到了hash排序。看下面的示例,很简单,主要是有被一个问题”坑”到了,所以写此文记录
h={'a'=>2, 'c'=>1, 'b'=>3}
sort方法:
升序排序
h.sort{|a,b| a[0]<=>b[0]}
#=> [["a", 2], ["b", 3], ["c", 1]] 根据key排序得到的是数组,想要得到hash的话,下面这样做
Hash[h.sort{|a,b| a[0]<=>b[0]}]
#=> {"a"=>2, "b"=>3, "c"=>1}
这里面是根据key排序. a[0] b[0] 可以发现这是hash的key。 这样a[1] b[1]就是hash的value咯
h.sort{|a,b| a[1]<=>b[1]}
#=> [["c", 1], ["a", 2], ["b", 3]]
Hash[h.sort{|a,b| a[1]<=>b[1]}]
#=> {"c"=>1, "a"=>2, "b"=>3}
这里面是根据value排序. a[1] b[1]就是hash的value
降序排序
h.sort { |a, b| b[0]<=>a[0]}
#=> [["c", 1], ["b", 3], ["a", 2]] 根据key
h.sort { |a, b| b[1]<=>a[1]}
#=> [["b", 3], ["a", 2], ["c", 1]] 根据value
sort_by 方法
升序排序
h.sort_by {|key,value| key}
#=> [["a", 2], ["b", 3], ["c", 1]] 根据key
h.sort_by {|key,value| value}
#=> [["c", 1], ["a", 2], ["b", 3]] 根据value
降序排序
h.sort_by {|key,value| -key} #=> [[“a”, 2], [“b”, 3], [“c”, 1]] 根据key h.sort_by {|key,value| -value} #=> [[“c”, 1], [“a”, 2], [“b”, 3]] 根据value
项目中遇到的”坑”是: 字符串的排序完全按照字符ASCII码的顺序,和字符串的长度毫无关系。 所以,在项目中得到的排序结果一直不对劲。比如key为”100”的升序排在了”2”的前面。然后,发现了这个问题。 将key直接使用to_i,为整数。这样排序就得到了想要的结果。
补充: hash 数组的排序。例如,自构建对象数组的排序。
score_ary = [{score: 100},{score: 80},{score: 90}]
score_ary.sort_by(&:sort)
#=> [{:score=>80}, {:score=>90}, {:score=>100}]
会根据keyvalue的值进行顺序排序
本文完