如何在ruby中从Hash中获取前n个元素?

har*_*hit 30 ruby

我有一个哈希,我已经使用值对它进行了排序

@friends_comment_count.sort_by{|k,v| -v}
Run Code Online (Sandbox Code Playgroud)

现在我只想得到前五个元素的哈希值.一种方法是使用一个计数器并在它的时候中断5.什么是红宝石的首选方法?

谢谢

Mar*_*oda 31

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

# get the first two
p Hash[*h.sort_by { |k,v| -v }[0..1].flatten]
Run Code Online (Sandbox Code Playgroud)

编辑:

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

  • 你不需要splat或`flatten`,只需将AoA提供给`Hash []`:`Hash [h.sort_by {| k,v | -v} [0..1]]` (3认同)

Tri*_*ulo 19

你不能只做这样的事情:

h = {"test"=>"1", "test2"=>"2", "test3"=>"3"}
Run Code Online (Sandbox Code Playgroud)

然后,如果你想要前2:

p h.first(2).to_h
Run Code Online (Sandbox Code Playgroud)

结果:

=> {"test"=>"1", "test2"=>"2"}
Run Code Online (Sandbox Code Playgroud)

  • 不是最有效的方法,尤其是对于大哈希值,但在您需要时是一个不错的、简单的 hack。 (2认同)

Mik*_*rth 7

我自己也是红宝石的新手(如果我错了,请多好!)但这有用吗?

@friends_comment_count.sort_by{|k,v| -v}.first 5
Run Code Online (Sandbox Code Playgroud)

如果我已经理解你正在努力实现的目标,那么我在IRB工作

  • 这将有效,但结果是一个数组数组.`[[:一,1],[:B,2]]`.哈希转换为数组,然后在该数组上使用`first`方法 (2认同)
  • 但是你可以通过将它包装在`Hash []`中来将该数组数组转换回Hash:`Hash [@ friends_comment_count.sort_by {| k,v | -v} .first 5]`. (2认同)