ruby - 如何在避免被零除的同时按比率排序?

标签 ruby algorithm sorting

考虑一个类 Team,类变量为“wins”和“loss”。我希望按胜负比对一组团队进行排序,这样:

5:0 > 3:0 > 1:0 > 3:1 > 5:5 > 3:3 > 1:3 > 0:1 > 0:3 > 0:5

我已经有了一个(部分)拼凑的解决方案,我对此并不满意,我想知道是否有更清洁/更优雅/更简单的方法来解决这个问题。

def ratio
    if @losses == 0 then 
        return 1000000+@wins
    end
    if @wins == 0 then
        return 0-@losses
    end
    return @wins/@losses
end

(这不能解决 5:5 > 3:3)

这将在 Team 类中并且可以像这样使用:

teams.sort! { |a, b| b.ratio <=> a.ratio }

解决这个问题最简单的方法是什么? (解决方案不一定是 Ruby,我对任何面向对象的东西都很满意)

最佳答案

我不会说 Ruby,但是可以提供您想要的结果的 Python 方法会使用元组作为键(在 decorate-sort-undecorate “Schwartzian transform”惯用语中。)

例如,您可以按获胜分数排名,然后是获胜次数,然后是(负)失败次数,这将给出您想要的顺序:

>>> wl = [[3, 0], [3, 1], [0, 5], [3, 3], [0, 3], [5, 5], [1, 3], [5, 0]]
>>> 
>>> def rank(wl):
...     win, loss = wl
...     return (1.0*win/(win+loss) if win+loss > 0 else 0), win, -loss
... 
>>> sorted(wl, key=rank)
[[0, 5], [0, 3], [1, 3], [3, 3], [5, 5], [3, 1], [3, 0], [5, 0]]
>>> sorted(wl, key=rank)[::-1]
[[5, 0], [3, 0], [3, 1], [5, 5], [3, 3], [1, 3], [0, 3], [0, 5]]

不幸的是,我不知道 Ruby 的等价物是什么,但我收集到有一个 sort_by 方法在某处 float 。

关于ruby - 如何在避免被零除的同时按比率排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14530264/

相关文章:

algorithm - 为什么基数排序的运行时间在基数等于要排序的数字个数时最小化?

algorithm - 使用 BFS 找到从 s 到 t 的最昂贵路径

algorithm - 基于队列的 Bellman-Ford 算法

javascript - 在 D3 中对条形图进行排序

ruby - 如何在 Ruby 中获取 13 位整数的当前时间?

ruby-on-rails - Rails Ancestry gem : how to write scope to match all parents

ruby-on-rails - 为什么我应该在 Rails 中使用 RSpec 或 shoulda?

ruby - 如何只允许 Ruby 函数中的参数为特定类型?

sorting - 我需要做什么才能使 SOLR 中的字段可排序?

r - 以预定顺序对向量进行排序