5

我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及用于奖牌计数的“金”、“银”、“铜”。

列表应排序: 1. 首先按奖牌总数 2. 如果奖牌相同,则按类型(金牌 > 银 > 铜牌,即两金 > 1 金 + 1 银) 3. 如果奖牌和类型相同,则按类型分- 按字母顺序排序

我正在用红宝石做这个,但我想语言并不重要。我确实想出了一个解决方案,但如果感觉必须有一种更优雅的方式来做到这一点。

这是我所做的:

  1. 使用加权奖牌总数创建一个虚拟属性。因此,如果他们有 2 枚金币和 1 枚银币,加权总数将为“3.020100”。1金1银1铜为“3.010101”

  2. 由于我们想首先将奖牌数排序为最高,因此列表按 DESC 排序。但是之后我们想要按字母顺序(即 ASC)进行子排序。所以我创建了一个可以对单词进行 alpha 反转的函数(即“canada”=>“xzmzwz”)

  3. 将加权总数转换为字符串,连接反向名称(即“3010101xzmzwz”),然后降序排序。瞧。

到目前为止,有人已经弄清楚了如何用大约 2 行代码来做同样的事情。愿意开导我吗?

4

3 回答 3

10
countries.sort_by do |country|
  medals = country.gold + country.silver + country.bronze
  [-medals, -country.gold, -country.silver, country.name]
end
于 2010-02-09T21:06:32.810 回答
1

一个简单的方法是将 sort_by 与一些任意格式的字符串一起使用,例如:

countries.sort_by do |c|
  "%010d-%010d-%010d-%s" % [ c.gold, c.silver, c.bronze, c.name ]
end

这通过将赢得的奖牌数量填充到可能令人发指的 10 位,将所有国家/地区转换为 ASCII 可排序列表。如果有人赢得超过 100 亿枚奖牌,您的程序可能会出现故障,但这似乎是一个合理的限制。

于 2010-02-09T22:44:10.400 回答
0

在 Java 中,您可以在对象上实现可比较,然后可以轻松地将其排序为 ArrayList 或 Array。Ruby 中是否有一种机制可以告诉您如何比较您的两个“国家”对象?

于 2010-02-10T04:10:14.517 回答