java做成績排名表,如何實現同分同名次


https://zhidao.baidu.com/question/1900171286360976020.html?qq-pf-to=pcqq.c2c

 

思路: 排序肯定還是要排的, 按照Java成績來進行排練. 然后排名的時候,進行比較. 如果這一名的成績和上一名的相同, 那么名次相同, 如果比上一名分數低,那么排名加一.

可以使用傳統的,集合排序,輸出. 也可以使用java8新提供的Stream API進行操作

參考代碼如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import  java.util.*;
import  java.util.Map.Entry;
import  java.util.stream.Collectors;
 
class  Stu { // 學生類
     private  String name;
     private  double  score; // 成績
 
     public  Stu(String name,  double  score) {
         this .name = name;
         this .score = score;
     }
     public  double  getScore() {
         return  score;
     }
     public  void  setScore( double  score) {
         this .score = score;
     }
     public  String getName() {
         return  name;
     }
     public  void  setName(String name) {
         this .name = name;
     }
}
 
//測試類
public  class  TestDemo {
     public  static  void  main(String[] args) {
         List<Stu> stus = Arrays.asList( new  Stu( "Tom" 79.5 ),  new  Stu( "Jack" 52 ),  new  Stu( "Amdy" 79.5 ),
                 new  Stu( "Lucy" 68 ),  new  Stu( "Cherry" 79.5 ),  new  Stu( "Jerry" 52 ),  new  Stu( "Sweet" 91 ),
                 new  Stu( "Solem" 65 ));
         fun1(stus);
         System.out.println( "---------------分割線---------------------" );
         fun2(stus);
     }
 
     // 方法一:傳統的方法
     public  static  void  fun1(List<Stu> stus) {
         // 按照成績排序
         stus.sort( new  Comparator<Stu>() {
             @Override
             public  int  compare(Stu s1, Stu s2) {
                 return  -Double.compare(s1.getScore(), s2.getScore());
             }
         });
         int  index =  0 ; // 排名
         double  lastScore = - 1 ; // 最近一次的分
 
         for  ( int  i =  0 ; i < stus.size(); i++) {
             Stu s = stus.get(i);
             if  (Double.compare(lastScore, s.getScore())!= 0 ) {  // 如果成績和上一名的成績不相同,那么排名+1
                 lastScore = s.getScore();
                 index++;
             }
             System.out.println( "名次:"  + index +  "\t分數"  + s.getScore() +  "\t名字"  + s.getName());
         }
     }
 
 
     // 方法2: Java8開始支持的Lambada表達式配合 Stream API 來進行分組排序
     public  static  void  fun2(List<Stu> stus) {
         List<Entry<Double, List<Stu>>> list = stus.stream().collect(Collectors.groupingBy(Stu::getScore)).entrySet()
                 .stream().sorted((s1, s2) -> -Double.compare(s1.getKey(), s2.getKey())).collect(Collectors.toList());
         int  index =  1 ;
         for  (Entry<Double, List<Stu>> entry : list) {
             System.out.print( "名次:"  + index +  "\t分數:"  + entry.getKey() +  "\t名字" );
             entry.getValue().forEach((s) -> System.out.print( "  "  + s.getName()));
             System.out.println();
             index++;
         }
     }
}

輸出結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
名次: 1     分數 91.0   名字Sweet
名次: 2     分數 79.5   名字Tom
名次: 2     分數 79.5   名字Amdy
名次: 2     分數 79.5   名字Cherry
名次: 3     分數 68.0   名字Lucy
名次: 4     分數 65.0   名字Solem
名次: 5     分數 52.0   名字Jack
名次: 5     分數 52.0   名字Jerry
名次: 1     分數: 91.0  名字  Sweet
名次: 2     分數: 79.5  名字  Tom  Amdy  Cherry
名次: 3     分數: 68.0  名字  Lucy
名次: 4     分數: 65.0  名字  Solem
名次: 5     分數: 52.0  名字  Jack  Jerry
---------------分割線---------------------
名次: 1     分數: 91.0  名字  Sweet
名次: 2     分數: 79.5  名字  Tom  Amdy  Cherry
名次: 3     分數: 68.0  名字  Lucy
名次: 4     分數: 65.0  名字  Solem
名次: 5     分數: 52.0  名字  Jack  Jerry

 

另外一種情況,相同並列,不同跳過----

Collections.sort(stdGpas, new Comparator<StdGpa>(){
@Override
public int compare(StdGpa s1, StdGpa s2) {
return -Double.compare(s1.getGpa(), s2.getGpa());
}
});
int index = 0;// 排名
int no = 0;//去重
double lastScore = -1;// 最近一次的分

for (int i = 0; i < stdGpas.size(); i++) {
StdGpa s = stdGpas.get(i);
if (Double.compare(lastScore, s.getGpa())!=0) { // 如果成績和上一名的成績不相同,那么排名+1
lastScore = s.getGpa();
index = index + 1 + no;
no = 0 ;
}else{
no++;
}
gpaRank.put(s.getId(), index);
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM