我对如何使用 sort_by
方法感到困惑。我该如何重新排列:
@final_leaderboard = {
"Patriots" => {"Win"=>3, "Loss"=>0},
"Broncos" => {"Win"=>1, "Loss"=>1},
"Colts" => {"Win"=>0, "Loss"=>2},
"Steelers" => {"Win"=>0, "Loss"=>1},
}
产生这个:
Patriots 3 0
Broncos 1 1
Steelers 0 1
Colts 0 2
到目前为止,我有这段代码,但它被颠倒了,并且损失值不正确。我要做的是先按获胜条件排序。获胜次数最多的球队将排在@final_leaderboard 散列中的第一项,其次是野马队取得一场胜利,然后是钢人队和小马队。但是,我也想按损失排序。例如,我希望钢人队被列为@final_leaderboard 哈希中的第三项,因为它输了一场,而小马队输了两场。
@final_leaderboard = @final_leaderboard.sort_by do |key,value|
value["Loss"] <=> value["Win"]
end
上面的代码片段会产生这样的输出:
Patriots 3 0
Broncos 1 1
Colts 0 2
Steelers 0 1
最后两项不正确,但我不知道需要在代码片段中更改什么才能使钢人队和小马队逆转。我不熟悉 sort_by 方法,Ruby 文档上的 sort_by 方法示例/说明没有像其他方法那样的可视化示例,所以我不太确定如何使用它。如果有人可以向我解释如何对最后两项进行排序,我将不胜感激。谢谢。
此代码执行您所解释的内容:
@final_leaderboard.sort_by{|_, v| [-v["Win"], v["Loss"]]}
结果
[
["Patriots", {"Win" => 3, "Loss" => 0}],
["Broncos", {"Win" => 1, "Loss" => 1}],
["Steelers", {"Win" => 0, "Loss" => 1}],
["Colts", {"Win" => 0, "Loss" => 2}]
]
当您想像您的情况一样按多个条件排序时,您可以在 sort_by
block 中使用数组。这里给出的 [-v["Win"], v["Loss"]]
指示首先通过比较每个哈希的 -v["Win"]
进行排序(其中v
是hash),就是按照Win
的降序排序,然后当有平局的时候,再看v["Loss"]
,即按照Loss
的升序排序。
我是一名优秀的程序员,十分优秀!