下降按Ruby中的Hash值排序

zen*_*ngr 66 ruby sorting hash

我的输入哈希: h = { "a" => 20, "b" => 30, "c" => 10 }

升序排序: h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]]

但是我需要 [["b", 30], ["a", 20], ["c", 10]]

我们怎样才能让它以相反的方式运作,<=>意味着什么?

gle*_*ald 176

你可以让它更清洁,更清晰,更快速!像这样:

h.sort_by {|k,v| v}.reverse
Run Code Online (Sandbox Code Playgroud)

我对使用随机值对1000个元素哈希进行排序的3000次迭代进行基准测试,得到以下时间:

h.sort {|x,y| -(x[1]<=>y[1])} -- 16.7s
h.sort {|x,y| y[1] <=> x[1]} -- 12.3s
h.sort_by {|k,v| -v} -- 5.9s
h.sort_by {|k,v| v}.reverse -- 3.7
Run Code Online (Sandbox Code Playgroud)

  • 你可能认为那会很糟糕!但是看看我上面添加的时间...... (17认同)
  • 在视觉上这是更干净但它会导致集合的额外遍历以反转它. (2认同)

dem*_*mas 11

h.sort {|a,b| b[1]<=>a[1]}
Run Code Online (Sandbox Code Playgroud)

  • 我赞成这个评论,不是因为答案是错误的,而是因为你没有解释为什么这是正确的答案.提问者甚至具体询问"<=>"是什么意思 - 所以他明确地解释了这一切是如何运作的.帮帮忙就是个好主意:) (7认同)

Chu*_*uck 9

<=>比较两个操作数,如果第一个较低则返回-1,如果它们相等则返回0,如果第一个较高则返回1.这意味着您可以-(a[1]<=>b[1])撤消订单.


Pau*_*eon 7

超级简单: h.sort_by { |k, v| -v }