【问题标题】:Sorting a hash by value then by key (but the key is reversed)按值然后按键对哈希进行排序(但键是相反的)
【发布时间】:2016-01-01 11:08:04
【问题描述】:

标题说明了一切。

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

我想按值排序,然后按键,但键按降序排列。

像这样:

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

我试过了:

return total.sort_by { |k, v| [v, k] }

但是从这里我不知道如何反转k...

【问题讨论】:

    标签: ruby sorting


    【解决方案1】:

    使用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}
    

    先按值排序(v1 &lt;=&gt; v2),再按键逆向排序(k2 &lt;=&gt; k1),由于我们同时需要,所以放入数组中。

    编辑:@Mirror318,看起来很吓人,看看这里的精彩解释:What is the Ruby <=> (spaceship) operator?

    【讨论】:

    • 这让我想爬到角落里>
    • @Mirror318 sort_by { |x| x } 大致相当于sort { |a, b| a &lt;=&gt; b }。相应地扩展您的代码,您几乎可以得到答案。
    • 镜像,用不了多久你就会把这当成例行公事了。
    【解决方案2】:

    另一种方式:

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

    【讨论】:

      【解决方案3】:

      如果您使用的是 ruby​​ >= 2.1,那么只需在已排序的元组数组上调用 to_h:

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

      其他电话Hash.new:

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

      【讨论】:

      • 这不会按降序对键进行排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2011-10-30
      • 2015-04-06
      • 2011-08-12
      相关资源
      最近更新 更多