1

我对如何使用该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 哈希中的第一个项目,其次是野马队以 1 场胜利,然后是钢人队和小马队。但是,我也想按损失排序。例如,我希望钢人队被列为@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

最后两项不正确,但我不知道代码片段中需要更改哪些内容才能逆转 Steelers 和 Colts。我不熟悉 sort_by 方法,并且 Ruby Docs 上的 sort_by 方法示例/说明没有像其他方法那样的可视化示例,所以我不太确定如何使用它。如果有人可以向我解释如何对最后两项进行排序,我将不胜感激。谢谢你。

4

3 回答 3

4

此代码执行您解释的操作:

@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块中的数组。这里的[-v["Win"], v["Loss"]]给定指示首先通过比较-v["Win"]每个哈希的 进行排序(哈希在哪里v),即按 的降序排序Win,然后当有平局时,它看v["Loss"],即按 的升序排序Loss

于 2014-03-03T07:19:43.773 回答
0

<=>无论两个操作数之间的差异如何,都只返回 1、0 或 -1:

1 <=> 7    # => -1
1 <=> 5    # => -1
3 <=> 2    # => 1
3 <=> 0    # => 1

你最好改用-运算符。

除此之外,sort,sort_by首先产生的价值很小。要首先列出更高的分数 ( win - loss),您需要否定分数。

除此之外,要获得您想要的完全相同的输出,您需要使用String%#or格式化输出sprintf

board.sort_by { |key,value| value['Loss'] - value['Win'] }.each do |key, value|
  puts "%-10s %2s %3s" % [key, value['Win'], value['Loss']]
end

输出:

Patriots    3   0
Broncos     1   1
Steelers    0   1
Colts       0   2

更新

这个答案是基于对排名的错误假设。请参阅sawa的回答

于 2014-03-03T07:15:29.207 回答
0

如果您的意思是先按Win数字排序,然后按Loss数字排序(按 Win desc,Loss asc 排序),那么您可以执行以下操作:

@final_leaderboard = @final_leaderboard.sort do |a, b|
  a[1]['Win'] == b[1]['Win'] ? a[1]['Loss'] <=> b[1]['Loss'] :  b[1]['Win'] <=> a[1]['Win']
end
于 2014-03-03T07:19:48.287 回答