将排序的Ruby数组转换为具有可能重复的排名

前端之家收集整理的这篇文章主要介绍了将排序的Ruby数组转换为具有可能重复的排名前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 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]

猜你在找的Ruby相关文章