Sorting a hash by value then by key (but the key is reversed)

后端 未结 3 535
梦毁少年i
梦毁少年i 2021-01-15 08:28

The title says it all.

total = {\"Bob\"=>37, \"Alice\"=>42, \"Carl\"=>42}

I want to sort it by value, and then by key, but with th

相关标签:
3条回答
  • 2021-01-15 08:43

    Another way:

    total.sort_by { |k,v| [-v,k] }.reverse.to_h
      #=> {"Bob"=>37, "Carl"=>42, "Alice"=>42}
    
    0 讨论(0)
  • 2021-01-15 08:50

    Use sort:

    total = {"Bob"=>37, "Alice"=>42, "Carl"=>42}
    total.sort { |(k1, v1), (k2, v2)| [v1, k2] <=> [v2, k1] }.to_h
    # => {"Bob"=>37, "Carl"=>42, "Alice"=>42}
    

    First, sort by values (v1 <=> v2) and then reverse sort by keys (k2 <=> k1), and since we need it simultaneously, put it into array.

    EDIT: @Mirror318, it just looks scary, take a look at the excellent explanation here: What is the Ruby <=> (spaceship) operator?

    0 讨论(0)
  • 2021-01-15 09:03

    If you're using ruby >= 2.1, then just call to_h on sorted array of tuples:

    total = {"Bob"=>37, "Alice"=>42, "Carl"=>42}
    total.sort_by{|k, v| [v, k]}.to_h
    

    Else call Hash.new:

    total = {"Bob"=>37, "Alice"=>42, "Carl"=>42}
    Hash.new total.sort_by{|k, v| [v, k]}.to_h
    
    0 讨论(0)
提交回复
热议问题