项目任务是要处理一个田径赛事的比赛结果。需要实现下面功能:
把某个比赛项目的成绩从高到低结果排序并在前面加上名次。成绩相同者名次相同,并按人名的字典(字母)顺序排序)。
比如本来结果的列表ArrayList<Result>输出如下:
成绩 名字
7.00 Donald Li
6.00 Joan Chen
7.00 Alan Jiang
4.00 Tricia Zhang
7.00 Ada Wang
6.00 William Sf
方法应该达到的理想效果如下
1 7.00 Ada Wang
1 7.00 Alan Jiang
1 7.00 Donald Li
4 6.00 Joan Chen
4 6.00 William Sf
6 4.00 Tricia Zhang
本人菜鸟,试了很多种方法都排不对,也不知道怎么在成绩前面加名次,请能者大神不吝赐教指点迷津,非常感谢!
不知楼主的问题有没有解决呢?我用C编写了一段代码,大致实现了上述功能,排序方法每种语言可能差不多,希望能帮到楼主吧。话不多说,上代码。
1 #include <stdio.h> 2 #include <string.h> 3 #define MAXNUM 20 4 5 struct Member 6 { 7 int rank; 8 char name[20]; 9 char score[20]; 10 }members[MAXNUM]; 11 12 main() 13 { 14 int i = 0, j = 0, k = 0; // i, j, k为循环变量 15 int flag; // 标志 16 struct Member temp[MAXNUM]; // 中间变量 17 18 /* *****************************从文档中获取成绩信息*********************************** */ 19 int ch; 20 FILE *fp; 21 fp = fopen("test.txt", "r"); 22 printf("从文档中获取到的信息为:\n"); 23 while((ch = getc(fp)) != EOF) 24 { 25 putchar(ch); 26 if(((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || (ch == ' ')) *(members[i].name + j++) = ch; 27 if((('0' <= ch) && (ch <= '9')) || (ch == '.')) *(members[i].score + k++) = ch; 28 if(ch == ';') 29 { 30 i++; 31 j = 0; 32 k = 0; 33 } 34 } 35 fclose(fp); 36 /* ************************************************************************************* */ 37 38 printf("\n\n排名信息如下:\n"); 39 printf("名次\t姓名\t\t成绩\n"); 40 41 /* *************************把获取到的成绩排序***************************************** */ 42 for(j = 0; j < i; j++) 43 { 44 for(k = j+1; k < i; k++) 45 { 46 flag = strcmp(members[j].score, members[k].score); 47 if((flag == 0) && (strcmp(members[j].name, members[k].name) > 0) || (flag < 0)) 48 { 49 temp[j] = members[k]; 50 members[k] = members[j]; 51 members[j] = temp[j]; 52 } 53 } 54 } 55 /* ************************************************************************************ */ 56 57 /* ************************将名次排序,成绩相同的名次相同****************************** */ 58 for(j = 0; j < i; j++) 59 { 60 members[0].rank = 1; 61 if(strcmp(members[j].score, members[j+1].score) == 0) members[j+1].rank = members[j].rank; 62 else members[j+1].rank = j + 2; 63 } 64 /* *********************************************************************************** */ 65 66 /* **************************************打印输出************************************* */ 67 for(j = 0; j < i; j++) printf("%d\t%s\t%s\n", members[j].rank, members[j].name, members[j].score); 68 69 getchar(); 70 }
希望对楼主有些帮助。
非常感谢回复!
我使用java的。现在我已经把结果列表按成绩高低和名字字母顺序排列好了,结果列表现在是resultList:
7.00 Ada Wang
7.00 Alan Jiang
7.00 Donald Li
6.00 Joan Chen
6.00 William Sf
4.00 Tricia Zhang
下面开始往结果前面加名次
int[] rank=new int[resultList.size()] ;
rank[0]=1;
for(int i=1; i<resultList.size();i++)
{if(resultList.get(i).getResultValue()==resultList.get(i-1).getResultValue())
{
rank[i]=rank[i-1];
}
else {
rank[i]=i+1;
}
}
for(int i=0; i<resultList.size();i++) {
System.out.println(rank[i]+" "+resultList.get(i).getResultValue()+" "+resultList.get(i).getParticipant().getName()+" "+resultList.get(i).getParticipant().getTeam());
}
打印结果居然是:
1 7.00 Ada Wang
2 7.00 Alan Jiang
3 7.00 Donald Li
4 6.00 Joan Chen
5 6.00 William Sf
6 4.00 Tricia Zhang
很奇怪。当两项结果值相同时,怎么没有执行if结果把rank变为相同呢?
那么你题目中的名次是怎么加出来的?现实中你怎么做的,软件就可以怎么实现。
我用collections.sort()的方法把成绩列表按成绩及姓名顺序排列好了,但是苦于不知道怎么把名次加到各个结果的前面去。难就难在成绩相同者共享名次。。
@jinleiDev:
Class StudentScore
{
int Rank;
decimal Score;
string Name;
}
排序后,遍历,给Rank赋值就行了。赋值前判断一下是否名次需要加1就行了。
@爱编程的大叔: 不太懂 能不能写段代码看看?