按Ruby中的哈希值降序排序


76

我的输入哈希: 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]]

我们如何使它反过来起作用,这<=>是什么意思?

Answers:


188

您可以一次拥有更清洁,更清晰和更快的功能!像这样:

h.sort_by {|k,v| v}.reverse

我用随机值对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

3
从外观上看这是更干净的方法,但是会引起遍历集合的更多操作以将其反转。
锡人2010年

@glennmcdonald能否请您告诉我,如何计算红宝石中每次通话的时间?
boddhisattva

1
我发现了如何计算每次通话的时间。这是一个示例链接:-ruby-doc.org/core-1.9.3/Enumerable.html#method-i-sort
boddhisattva

h.sort_by(&:last).reverse呢 任何时候吗?
Cruz Nunez

哪个Ruby版本?
danielricecodes

12
h.sort {|a,b| b[1]<=>a[1]}

7
我否决了此评论,不是因为答案有误,而是因为您没有解释为什么这是正确的答案。提问者甚至专门询问“ <=>”是什么意思-因此,在对这一切的工作原理进行了一些解释之后,他很清楚。这是个好主意:)
Taryn East,

PS:有关更多信息,请参见meta上的Stack Overflow审查政策:meta.stackexchange.com/questions/74194/…–
Taryn East

10

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


1
我总是更喜欢看到它被替换为“ a”和“ b”元素,而不是否定结果。交换它们后,我只需要查看他们的顺序即可看到他们倒退了,知道它已经反转了。当的值<=>取反时,我仍然必须查看实际比较以了解发生了什么。这是次要的要点,但是我知道一点,因为我感觉自己的大脑在做完“什么!?”之后必须做第二次检查。
Tin Man 2010年

1
@Greg:我一定会明白为什么您更喜欢它。我相反​​:在我的视线中,b[1]<=>a[1]看起来就像是在打招呼a[1]<=>b[1],我觉得有必要停下来检查一下,而这种否定使我们立即明显地知道我们正在做反向排序。
Chuck

我也明白你的意思。无论哪种方式,都仍然需要仔细观察所比较的值。也许我们需要其他运算符->=<进行逆序处理?不,那同样糟糕。这是整个结构,但是我更喜欢<=>一种更冗长的方法,在这种方法中,我们不得不调用一些方法名称。
Tin Man 2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.