【问题标题】:Sorting Hash by value [duplicate]按值排序哈希[重复]
【发布时间】:2016-11-21 08:23:49
【问题描述】:

我想按值对我的拥有进行排序。我试图对我的哈希排序way,但它不起作用,我不知道为什么。 这是我的代码:

test="neki text sa recima neki sa i jos neki aa"
mapa=Hash.new(0)
test.split(" ").each do |rec|
    mapa[rec]+=1
end

mapa.sort_by {|a,b| b}.reverse

mapa.each do |key, value|
    puts "#{key} #{value}" 
end

输出是:

neki 3
text 1
sa 2
recima 1
i 1
jos 1
aa 1

它对 HASH 没有任何作用:/ 有人可以向我解释为什么它不起作用吗?

如果你给我一个减号,请在评论中解释我做了什么值得它,这样我就知道在哪里改进。 :)

【问题讨论】:

标签: ruby sorting hash


【解决方案1】:

Enumerable#sort_by 从未承诺对可枚举的就地进行排序。它返回结果:

puts mapa.sort_by {|a,b| -b}
#⇒ sorted

或者,以更惯用的方式:

mapa.sort_by(&:last).reverse.each do |k, v|
  puts ...
end

请注意,在检查irb 中的输出时,该顺序可能与哈希中元素的实际顺序不对应,因为irb(安装了打印格式化程序)对如何输出哈希有自己的想法.

【讨论】:

  • 谢谢。所以我只能说 mapa = mapa.sort_by {|a,b| b}.反向。我不知道它返回一个值,我认为它会改变 HASH。
  • 嗯,是的。基本上在 ruby​​ 中,mutate 一个对象的所有函数,按照惯例都被称为具有尾随 bang:sort_by! 将改变散列本身(如果存在)。
  • mudsie,你会把mapa.max_by(mapa.size, &:last).to_h #=> {:neki=>3, :sa=>2, :i=>1, :aa=>1, :jos=>1, :text=>1, :recima=>1} 放在哪里?
  • @CarySwoveland 因为惯用的 ruby​​ 由哈希 {way_of_solution => ->() {} } 表示,它在 ruby​​ 中是无序的 :) 好吧,开个玩笑,我喜欢 max_by 胜过我的 sort_by
猜你喜欢
  • 2021-10-28
  • 2010-10-20
  • 2018-07-21
  • 1970-01-01
  • 2014-10-27
  • 2011-07-07
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多