我在
Ruby中有以下数字数组(越高越好),我想对它们进行排名.换句话说,我想转换以下排序列表:
[89 52 52 36 18 18 5]
到以下等级:
[1 2 2 4 5 5 7]
例如,获胜者获得第一名,第二名获得并列,依此类推.显然,重要的一点是,关系是可能的,那些关系必须跳过相应的级别.任何数量的关系都是可能的(3人分享第二名).
有没有一种优雅的方式来执行这种操作?
解决方法
使用
Enumerable#group_by
:
a = [89,52,36,18,5] rank = 1 a.group_by {|x| x}.map { |k,v| ret = [rank] * v.size rank += v.size ret }.flatten # => [1,2,4,5,7]
UPDATE
rank,i = 1,0 a.map { |x| i += 1 x != a[i-2] ? rank = i : rank } # => [1,7]