java实现并列占位排名,支持并列排序

一、功能说明:

1.实现并列占位排名,例如两个第一名,排序为:1、1、3

2.实现并列数据再次排名,例如两个第一名,学号在前的拍前面

二、缺点:

不适合大规模数据,其他问题暂未发现,欢迎补充

三、实现步骤和逻辑

1.根据分数将数据分组成map

2.将分组后的map转成list并按照分数排序

3.遍历list,将list中map中的list按照序号进行排序,实现并列数据排序

4.拼接最后的list

四、代码

//创建假数据
        List<Map<String, Object>> list = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("name", "罗1彤");  //名字
        map1.put("sort", "6");      //排序
        map1.put("fraction", "99"); //分数
        list.add(map1);
        Map<String, Object> map2 = new HashMap<>();
        map2.put("name", "罗2彤");
        map2.put("sort", "5");
        map2.put("fraction", "99");
        list.add(map2);
        Map<String, Object> map3 = new HashMap<>();
        map3.put("name", "罗3彤");
        map3.put("sort", "4");
        map3.put("fraction", "98");
        list.add(map3);
        Map<String, Object> map4 = new HashMap<>();
        map4.put("name", "罗4彤");
        map4.put("sort", "3");
        map4.put("fraction", "98");
        list.add(map4);
        Map<String, Object> map5 = new HashMap<>();
        map5.put("name", "罗5彤");
        map5.put("sort", "2");
        map5.put("fraction", "97");
        list.add(map5);
        Map<String, Object> map6 = new HashMap<>();
        map6.put("name", "罗6彤");
        map6.put("sort", "1");
        map6.put("fraction", "100");
        list.add(map6);

        //数据根据 分数 进行分组 后排序
        List<Map.Entry<String, List<Map<String, Object>>>> tempList = list
                .stream()
                .collect(Collectors.groupingBy(item -> (String) item.get("fraction"))) //分数  分组
                .entrySet()
                .stream()
                .sorted((s1, s2) -> {     //排序
                    int a1 = Integer.parseInt(s1.getKey());
                    int a2 = Integer.parseInt(s2.getKey());
                    return (a1 < a2) ? 1 : -1;
                })
                .collect(Collectors.toList());

        //同分数据根据sort排序 
        for (Map.Entry<String, List<Map<String, Object>>> entry : tempList) {
            List<Map<String, Object>> intemList = entry.getValue();
            entry.setValue(intemList
                    .stream()
                    .sorted((s1, s2) -> {  //子排序字段
                        int a1 = Integer.parseInt((String) s1.get("sort"));
                        int a2 = Integer.parseInt((String) s2.get("sort"));
                        return (a1 > a2) ? 1 : -1;
                    })
                    .collect(Collectors.toList()));

        }

        //创建最后的排序对象
        List<Map<String, Object>> resList = new ArrayList<>();
        int index=1;
        for (Map.Entry<String, List<Map<String, Object>>> entry : tempList) {
            List<Map<String, Object>> itemList = entry.getValue();
            for(Map<String, Object> itemMap:itemList){
                itemMap.put("index",index);
                resList.add(itemMap);
            }
            index=index+itemList.size();
        }
        resList.forEach(System.out::println);

五、运行结果截图

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老衲丶有点浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值