如何从Ruby的哈希表中获取前n个元素?

36

我有一个哈希表,我已经按照值对它进行了排序

@friends_comment_count.sort_by{|k,v| -v}

现在我只想获取前五个元素的哈希值...一种方法是使用计数器,当其为5时中断。 在Ruby中有更好的方法吗?

谢谢

6个回答

34
h = { 'a' => 10, 'b' => 20, 'c' => 30 }

# get the first two
p Hash[*h.sort_by { |k,v| -v }[0..1].flatten]

编辑

# get the first two (more concisely)
p Hash[h.sort_by { |k,v| -v }[0..1]]

3
不需要使用 splat 或 flatten,只需将 AoA 传递给 Hash[]Hash[h.sort_by { |k,v| -v }[0..1]] - mu is too short
我更喜欢这种语法:p h.sort_by { |k,v| -v }[0..1].to_h - Jussi Hirvi

29
你要这样做:
h = {"test"=>"1", "test2"=>"2", "test3"=>"3"}

然后,如果你想要前两个:
p h.first(2).to_h

结果:

=> {"test"=>"1", "test2"=>"2"}

2
这不是最有效的方法,特别是对于大哈希表而言,但当你需要它时,这是一个不错的、简单的技巧。 - tristanm
它的效率在哪里不高?因为哈希表需要重新构建吗?我认为所有其他解决方案都需要进行类似的工作。 - John Bachir

7

我自己对Ruby也是新手(如果我错了,请不要太苛刻!)但这样行得通吗?

@friends_comment_count.sort_by{|k,v| -v}.first 5

如果我正确理解您想实现的内容,在IRB中可以正常工作。


2
可以这样做,但结果是一个数组的数组。 [[:a,1],[:b,2]]。哈希被转换为一个数组,然后在该数组上使用了 first 方法。 - Kassym Dorsel
2
但是你可以通过将数组包装在Hash[]中来将那个数组转换回哈希表,如下所示:Hash[@friends_comment_count.sort_by{|k,v| -v}.first 5] - mu is too short
谢谢大家,昨天被欺负后我几乎不敢回答问题了! - Mikey Hogarth

4
你不能对哈希进行排序,这就是为什么sort_by不会对你的哈希进行排序。它返回一个已排序的数组。

3
在Ruby 2.2.0及以后版本中,Enumerable#max_by方法可以接受一个可选的整数参数,使其返回一个数组而不是仅仅一个元素。这意味着你可以这样使用:
h = { 'a' => 10, 'b' => 20, 'c' => 30 }
n = 2
p h.max_by(n, &:last).to_h   # => {"b"=>20, "c"=>30}

0

哈希表本质上是无序的(尽管在 Ruby 实现中它们是有序的)。尝试将你的哈希表转换为数组,然后从中获取 [0,4]。


你确定它们是用 Ruby 写的吗?sort_by 返回一个数组。 - Oleg Mikheev
1
哈希表在 Ruby 1.9 中是有序的,但在 1.8 中它们不是有序的。 - Linuxios
@Oleg(很多设备无法输入您的名字,您知道的),是的,从1.9开始它们按插入顺序排序。 - Dave Newton
这很奇怪...就像 Ruby 中的许多其他事情一样。 - Oleg Mikheev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接