栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现按分数排名,同分同名次

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现按分数排名,同分同名次

解决方案1
    public void calculateScoreRank(List allFullScores) {
        Map stuMap = allFullScores.stream().collect(Collectors.toMap(StudentSubjectFullScoreDto::getStuId, StudentSubjectFullScoreDto->StudentSubjectFullScoreDto));
        //过滤掉不统计的数据,这些数据不参与排名
        List scoreRankList = allFullScores.stream().filter(t -> t.getStatisticsStatus() == CommonConst.TYPE_STATISTICS_ENABLE).collect(Collectors.toList());
        //按学生单科成绩总分倒序排列
        scoreRankList.sort(Comparator.comparingDouble(StudentSubjectFullScoreDto::getSumScore).reversed());
        //按分数分组,统计个数
        Map scoreMap = scoreRankList.stream().collect(Collectors.groupingBy(StudentSubjectFullScoreDto::getSumScore, Collectors.counting()));
        //初始值名次
        int rank = 1;
        double scoreRate = 1.0;	//此处不需要删除即可
        for (int i = 0; i < scoreRankList.size(); i++) {
            //得到相同分数的个数
            Long count = scoreMap.get(scoreRankList.get(i).getSumScore());
            scoreRate=new BigDecimal(scoreRankList.size() - rank).divide(new BigDecimal(scoreRankList.size()), 2, BigDecimal.ROUND_HALF_UP).doublevalue();
            if (count == 1) {
                StudentSubjectFullScoreDto copyDto = scoreRankList.get(i);
                StudentSubjectFullScoreDto sourceDto = stuMap.get(copyDto.getStuId());
                sourceDto.setScoreRank(rank++) ;
                sourceDto.setScoreRankRate(scoreRate);
            }else {
                //总分相同,名次相同
                for (int j = 0; j < count; j++) {
                    StudentSubjectFullScoreDto copyDto = scoreRankList.get(i+j);
                    StudentSubjectFullScoreDto sourceDto = stuMap.get(copyDto.getStuId());
                    sourceDto.setScoreRank(rank);
                    sourceDto.setScoreRankRate(scoreRate);
                }
                //排名还需要按人数顺序数他是第几个
                rank= (int) (rank+count);
                //连续n个相同的总分,排名一样
                i = (int) (i + count -1);
            }
        }
    }
解决方案2
public static Map rankScore(List stus) {
    Map map = new HashMap<>();
    List>> list = stus.stream().collect(Collectors.groupingBy(DeductPersonVO::getDeductScore)).entrySet()
            .stream().sorted((s1, s2) -> -Double.compare(s1.getKey(), s2.getKey())).collect(Collectors.toList());
    int index = 1;
    for (Map.Entry> entry : list) {
 
        map.put(entry.getKey(),index);
        entry.getValue().forEach((s) -> System.out.print("  " + s.getDeductScore()));
        System.out.println();
        index++;
    }
    return map;
}

取出值存入实体

Map rankMap2 = rankScore(personList);
personList.stream().forEach(bean -> {
    bean.setRank(rankMap2.get(bean.getDeductScore()));
});
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270508.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号