java8 对考生进行排名

简介: java8 对考生进行排名

第一种是分数一样的排名不相同,排名不重复。分数为空的考生不参与排名,排在后面。

第二种是分数一样排名相同,排名重复,但是会把位置占掉。(eg:1,2,2,2,2,6,7这种排名相同的情况)分数为空的考生不参与排名,排在后面。


package com.gaodun.test;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @Title: 测试考生信息列表排名
 * @Author: ken
 * @Description:
 * @Date: 2021/7/21  9:32
 **/
@Data
@AllArgsConstructor
class Student {
    String name;
    Integer score;
    Integer rank;
}

public class TestRank {
    public static void main(String[] args) {
        List<Student> studentList = Arrays.asList(
                new Student("ken1", 10, null),
                new Student("ken2", 20, null),
                new Student("ken3", 30, null),
                new Student("ken4", 40, null),
                new Student("ken5", 50, null),
                new Student("ken6", 60, null),
                new Student("ken7", 70, null),
                new Student("ken8", 80, null),
                new Student("ken9", 90, null),
                new Student("ken10", 100, null),
                new Student("ken11", 100, null),
                new Student("ken12", 100, null),
                new Student("ken13", 100, null),
                new Student("ken14", 990, null),
                new Student("ken15", null, null),
                new Student("ken16", null, null),
                new Student("ken17", null, null),
                new Student("ken18", null, null),
                new Student("ken19", null, null)
        );
        System.out.println("#################################### 1.过滤掉分数为空的学生进行排名(排名不重复) ####################################");
        System.out.println("排名前:" + studentList.toString());
        //过滤掉分数为空值的学生进行排名
        List<Student> studentSortList = studentList.stream().filter(a -> Objects.nonNull(a.getScore())).sorted(Comparator.comparing(Student::getScore)
                .reversed()).collect(Collectors.toList());
        Map<String, Integer> userRankMap = Maps.newConcurrentMap();
        for (int i = 0; i < studentSortList.size(); i++) {
            studentSortList.get(i).setRank(i + 1);
        }
        List<Student> studentScoreNullList = studentList.stream().filter(a -> Objects.isNull(a.getScore())).collect(Collectors.toList());
        List<Student> studentNotpeatScoreNullList = studentSortList;
        //先统计有分数学员的人数,再把没有分数的考生加进去
        studentNotpeatScoreNullList.addAll(studentScoreNullList);
        System.out.println("1.统计排名人数:" + studentNotpeatScoreNullList.size());
        System.out.println("1.排名后:" + studentNotpeatScoreNullList.toString());

        //推荐写法
        System.out.println("#################################### 3.为空的放在最后(分数相同排名相同) ####################################");
        List<Student> finalList = studentList.stream().sorted(Comparator.comparing(Student::getScore, Comparator.nullsFirst(Integer::compareTo))
                .reversed()).collect(Collectors.toList());
        System.out.println("3.统计排名人数:" + finalList.size());
        System.out.println("3.排名后:" + finalList.toString());
    }
}

结果打印:

1.过滤掉分数为空的学生进行排名(排名不重复)

排名前:[Student(name=ken1, score=10, rank=null), Student(name=ken2, score=20, rank=null), Student(name=ken3, score=30, rank=null), Student(name=ken4, score=40, rank=null), Student(name=ken5, score=50, rank=null), Student(name=ken6, score=60, rank=null), Student(name=ken7, score=70, rank=null), Student(name=ken8, score=80, rank=null), Student(name=ken9, score=90, rank=null), Student(name=ken10, score=100, rank=null), Student(name=ken11, score=100, rank=null), Student(name=ken12, score=100, rank=null), Student(name=ken13, score=100, rank=null), Student(name=ken14, score=990, rank=null), Student(name=ken15, score=null, rank=null), Student(name=ken16, score=null, rank=null), Student(name=ken17, score=null, rank=null), Student(name=ken18, score=null, rank=null), Student(name=ken19, score=null, rank=null)]
1.统计排名人数:19
1.排名后:[Student(name=ken14, score=990, rank=1), Student(name=ken10, score=100, rank=2), Student(name=ken11, score=100, rank=3), Student(name=ken12, score=100, rank=4), Student(name=ken13, score=100, rank=5), Student(name=ken9, score=90, rank=6), Student(name=ken8, score=80, rank=7), Student(name=ken7, score=70, rank=8), Student(name=ken6, score=60, rank=9), Student(name=ken5, score=50, rank=10), Student(name=ken4, score=40, rank=11), Student(name=ken3, score=30, rank=12), Student(name=ken2, score=20, rank=13), Student(name=ken1, score=10, rank=14), Student(name=ken15, score=null, rank=null), Student(name=ken16, score=null, rank=null), Student(name=ken17, score=null, rank=null), Student(name=ken18, score=null, rank=null), Student(name=ken19, score=null, rank=null)]

3.为空的放在最后(分数相同排名相同)

3.统计排名人数:19
3.排名后:[Student(name=ken14, score=990, rank=1), Student(name=ken10, score=100, rank=2), Student(name=ken11, score=100, rank=3), Student(name=ken12, score=100, rank=4), Student(name=ken13, score=100, rank=5), Student(name=ken9, score=90, rank=6), Student(name=ken8, score=80, rank=7), Student(name=ken7, score=70, rank=8), Student(name=ken6, score=60, rank=9), Student(name=ken5, score=50, rank=10), Student(name=ken4, score=40, rank=11), Student(name=ken3, score=30, rank=12), Student(name=ken2, score=20, rank=13), Student(name=ken1, score=10, rank=14), Student(name=ken15, score=null, rank=null), Student(name=ken16, score=null, rank=null), Student(name=ken17, score=null, rank=null), Student(name=ken18, score=null, rank=null), Student(name=ken19, score=null, rank=null)]

Process finished with exit code 0

目录
相关文章
|
SQL Java
解读JAVA处理排名问题-关于学生成绩排名及Collections中的sort方法与Comparable的使用
写一个项目真是存在很多的bug,修复的时间往往比开发所需要的时间更长,今天又出了一个bug,在这里记录一下,主要是针对系统中学生的成绩排名。
147 0
|
4月前
|
存储 Java 索引
[Java]随机排名
需求:某公司开发部5名开发人员需按随机顺序进行项目进展汇报。实现步骤包括: 1. 使用动态初始化数组录入5名员工的工号。 2. 遍历数组,每次随机选择一个索引并与当前索引的数据交换,实现随机排序。 3. 输出随机排序后的工号序列。
43 1
|
5月前
|
Java
排名前16的Java工具类
排名前16的Java工具类
38 0
|
存储 缓存 JavaScript
Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》
Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》
77 0
|
Java
排名前16的Java工具类
排名前16的Java工具类
191 0
|
消息中间件 安全 Java
Java项目权威排名来了:Gradle排名第二,Maven排名28,Nacos没有上榜
Java项目权威排名来了:Gradle排名第二,Maven排名28,Nacos没有上榜
221 0
Java项目权威排名来了:Gradle排名第二,Maven排名28,Nacos没有上榜
|
人工智能 搜索推荐 Java
最新编程语言排名,Java 沦为老三。。
2021 年 9 月刚过去,栈长看了下最新的 tiobe 编程语言榜:
157 0
最新编程语言排名,Java 沦为老三。。
|
人工智能 搜索推荐 Java
卧槽!最新编程语言排名,Java 沦为老二。。
2020 年 9 月刚过去,栈长看了下最新的 tiobe 编程语言榜,牛逼啊,C 语言居然登顶了,Java 下降 3 个点,沦为老二的位置。
171 0
卧槽!最新编程语言排名,Java 沦为老二。。
排名前 16 的 Java 工具类,哪个你没用过?
在Java中,实用程序类是定义一组执行通用功能的方法的类。 这篇文章展示了最常用的Java实用工具类及其最常用的方法。类列表及其方法列表均按受欢迎程度排序。数据基于从GitHub随机选择的50,000个开源Java项目。 希望您可以通过浏览列表来了解
|
XML JSON JavaScript
干货:排名前 16 的 Java 工具类!
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码。
178 0