首页 新闻 会员 周边 捐助

对象排列问题

0
悬赏园豆:10 [已解决问题] 解决于 2018-01-07 23:46

项目任务是要处理一个田径赛事的比赛结果。需要实现下面功能:
把某个比赛项目的成绩从高到低结果排序并在前面加上名次。成绩相同者名次相同,并按人名的字典(字母)顺序排序)。

比如本来结果的列表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

本人菜鸟,试了很多种方法都排不对,也不知道怎么在成绩前面加名次,请能者大神不吝赐教指点迷津,非常感谢!

jinleiDev的主页 jinleiDev | 初学一级 | 园豆:142
提问于:2018-01-06 04:07
< >
分享
最佳答案
0

不知楼主的问题有没有解决呢?我用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 }

希望对楼主有些帮助。

收获园豆:10
小码哥鸭 | 菜鸟二级 |园豆:206 | 2018-01-07 09:19

非常感谢回复!

我使用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变为相同呢?

jinleiDev | 园豆:142 (初学一级) | 2018-01-07 19:07
其他回答(1)
0

那么你题目中的名次是怎么加出来的?现实中你怎么做的,软件就可以怎么实现。

爱编程的大叔 | 园豆:30844 (高人七级) | 2018-01-06 10:56

我用collections.sort()的方法把成绩列表按成绩及姓名顺序排列好了,但是苦于不知道怎么把名次加到各个结果的前面去。难就难在成绩相同者共享名次。。

支持(0) 反对(0) jinleiDev | 园豆:142 (初学一级) | 2018-01-06 19:43

@jinleiDev: 

Class StudentScore

{

     int Rank;

     decimal Score;

     string Name;

}

 

排序后,遍历,给Rank赋值就行了。赋值前判断一下是否名次需要加1就行了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2018-01-06 20:28

@爱编程的大叔: 不太懂 能不能写段代码看看?

支持(0) 反对(0) jinleiDev | 园豆:142 (初学一级) | 2018-01-06 21:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册