统计排序,同分数同排名,连续排名和同分数同名次排序(lambda表达式整数倒序),同分同名间断排名

该博客展示了如何使用Java进行分数统计排序,包括同分数时保持名次连续和不连续两种情况。通过Lambda表达式整数倒序排序,以及自定义Comparator,实现了对分数列表的处理,输出了每个分数及其对应的排名。
摘要由CSDN通过智能技术生成

总分数排名,连续排序和同分数同名次排序(lambda表达式整数倒序scores.sort(Comparator.reverseOrder());)

统计排序,同分数同排名,连续排名和同分数同名次排序(lambda表达式整数倒序),同分同名间断排名

import org.springframework.util.CollectionUtils;

import java.util.*;

public class Rank {
    public static void main(String[] args) {
        List<Integer> scores = Arrays.asList(320, 321, 321, 300, 288, 288, 287);
        if (CollectionUtils.isEmpty(scores)) {
            System.err.println("参数错误!");
        }
        // Map<Integer, Long> map = scores.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting()));
        // System.err.println("集合:" + map); 取出所有key排序,然后遍历打印名次
        // 倒序
        // scores.sort(Comparator.reverseOrder());
        scores.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });

        int size = scores.size();
        if (size == 1) {
            System.err.println("数组仅有一个数: " + scores);
        }

        List<Integer> keys = new ArrayList<>();
        Map<Integer, Integer> score2NumMap = new LinkedHashMap<>();
        for (int i = 0; i < size; i++) {
            Integer key = scores.get(i);
            if (score2NumMap.containsKey(key)) {
                score2NumMap.put(key, score2NumMap.get(key) + 1);
            } else {
                score2NumMap.put(key, 1);
                keys.add(key);
            }
        }
        System.err.println("*********分数相同,排名连续,不同名次************");
        int ranking = 1;
        for (int i = 0; i < score2NumMap.size(); i++) {
            int score = keys.get(i);
            int number = score2NumMap.get(score);

            System.err.println("分数:" + score + ",排名:" + ranking);
            // 按分数连续排名
            if (number > 1) {
                for (int j = 1; j < number; j++) {
                    ++ranking;
                    System.err.println("分数:" + score + ",排名:" + ranking);
                }
            }
            ranking = ranking + 1;
        }

        System.err.println("**********以下分数相同,排名相同,不连续排名************");
        // 分数相同,排名相同
        int rankingOther = 1;
        for (int i = 0; i < score2NumMap.size(); i++) {
            int score = keys.get(i);
            int number = score2NumMap.get(score);

            System.err.println("分数:" + score + ",排名:" + rankingOther);
            // 按分数连续排名
            if (number > 1) {
                for (int j = 1; j < number; j++) {
                    System.err.println("分数:" + score + ",排名:" + rankingOther);
                }
                rankingOther = rankingOther + number;
            }
            rankingOther = rankingOther + 1;
        }

        System.err.println("**********以下分数相同,排名相同,连续排名************");

        int rankingAnother = 1;
        for (int i = 0; i < score2NumMap.size(); i++) {
            int score = keys.get(i);
            int number = score2NumMap.get(score);
            System.err.println("分数:" + score + ",排名:" + rankingAnother);
            // 按分数连续排名
            if (number > 1) {
                for (int j = 1; j < number; j++) {
                    System.err.println("分数:" + score + ",排名:" + rankingAnother);
                }
            }
            rankingAnother = rankingAnother + 1;
        }
    }
}

排名算法实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值