显示奥运会金牌榜
问题
下面是某届奥运会的比赛数据。
国家表:
运动员表记录了每位运动员所属的国家:
比赛成绩表记录了所有的比赛结果:
请列出本届奥运会的金牌榜,包括各个国家的金银铜牌数量,按金牌数排序,并给出名次,注意名次要考虑并列。
思路
大致思路:只要将运动员表中的国家字段替换为国家表中的记录,再将比赛结果表中的运动员字段也替换为相应记录,比赛成绩就可以直接和国家联系起来了,而后将比赛结果按国家分组,然后就很容易统计出各个国家的金银铜牌数量了。至于三个关键字排序的名次,只要直接以三个关键字组成的序列排序即可,而并列问题则可以使用 rank 函数解决。
-
首先将运动员表中的国家字段替换为国家表中相应的记录,比赛结果表中的运动员字段替换为运动员表中的相应记录。
-
将表按运动员的国家分组。
-
基于分组后的序列创建新序表,包含每个国家的名字、金银铜牌的数量统计,再预留一个名次字段,由于需要考虑并列,名次字段的值暂时留空,放到后面填写。
-
以金牌数、银牌数、铜牌数三个变量组成的序列排序,用 rank 函数填写排序名次。
-
最后依次按得到的名词作为关键字将表排好序即可。
代码
A | ||
---|---|---|
1 | =file("C:\\txt\\Country.txt").import@t().keys(ID) | 国家表 |
2 | =file("C:\\txt\\Athlete.txt").import@t().keys(Athlete) | 运动员表 |
3 | =file("C:\\txt\\MatchResult.txt").import@t() | 比赛结果表 |
4 | >A2.switch(Country,A1), A3.switch(Athlete,A2) | 先将运动员表和比赛结果表的字段替换为记录 |
5 | =A3.group(Athlete.Country) | 直接按运动员的国家分组 |
6 | =A5.new(:Ranking, Athlete.Country.Country:Country, ~.count(Ranking==1):Gold,~.count(Ranking==2):Silver, ~.count(Ranking==3):Bronze) | 创建新序表,同时求出每国金银铜牌数目并提取出国家名,并预留名次字段,值暂时留空 |
7 | =A6.([Gold,Silver,Bronze]) | 列出金银铜牌数的序列组成的序列 |
8 | >A6.run(Ranking=A7.rank@z([Gold,Silver,Bronze])) | 以金银铜牌数的序列算出每个国家的名次 |
9 | =A6.sort(Ranking) | 按名次排序表 |
英文版
数据文件
Athlete.txt
Country.txt
MatchResult.txt