文章目录

  • 一、排名算法
    • 1.代码如下:

一、排名算法

1.代码如下:

package com.yunhenedu.core.utils.rank;import com.yunhenedu.core.exception.BusinessException;
import com.yunhenedu.core.exception.ResultEnum;import java.util.*;
import java.util.stream.Collectors;/*** 描述  排名工具类** @author gx* @version 1.0* @date 2022/05/10 10:36:07*/
public class RankUtils {public static void main(String[] args) {List<Integer> scoreList = new ArrayList<>();scoreList.add(1);scoreList.add(1);scoreList.add(2);scoreList.add(3);scoreList.add(3);List<Map<String, Integer>> scoreRankOneList = getScoreRankOneList(scoreList, 1, 6);List<Map<String, Integer>> scoreRankTwoList = getScoreRankTwoList(scoreList, 1, 6);System.out.println(scoreRankOneList);System.out.println(scoreRankTwoList);}/*** 描述  方法二  该方法可用于分数排名,购买量排名等排名计算* 举例: 数据  [1,2,2,3,3]* 输出名次如下:* 第一名:3,3* 第二名;无   第二个人在第一名里 该位置空* 第三名:2,2* 第四名:无  第四个人在第三名 该位置空* 第五名:1** @param scoreList 进行排名的分数集合* @param startRank 开始名次* @param endRank   结束名次* @return java.util.List<java.util.Map < java.lang.String, java.lang.Integer>> 返回分数、分数对应的名次* @author gx* @date 2022/5/10 10:45:04* @version 1.0*/public static List<Map<String, Integer>> getScoreRankTwoList(List<Integer> scoreList, Integer startRank, Integer endRank) {Map<Integer, Integer> scoreRankMap = getScoreRankMap(scoreList);List<Map<String, Integer>> resultList = getScoreRankDataList(startRank, endRank, scoreRankMap);return resultList;}private static List<Map<String, Integer>> getScoreRankDataList(Integer startRank, Integer endRank, Map<Integer, Integer> scoreRankMap) {if (startRank < 0 || endRank < 0) throw new BusinessException(ResultEnum.ERROR, "输入名次不合法");List<Map<String, Integer>> resultList = new ArrayList<>();scoreRankMap.forEach((key, value) -> {//key:分数  value:名次System.out.println(key + ":" + value);if (value >= startRank && value <= endRank) {Map<String, Integer> map = new HashMap<>();map.put("score", key);//分数map.put(key.toString(), value);//分数对应的名次resultList.add(map);}});return resultList;}private static Map<Integer, Integer> getScoreRankMap(List<Integer> scoreList) {//分数倒序Collections.sort(scoreList, Collections.reverseOrder());Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < scoreList.size(); i++) {if (i == 0) {map.put(scoreList.get(0), (0 + 1));//分数对应的名次}if (!map.containsKey(scoreList.get(i))) {map.put(scoreList.get(i), (i + 1));//分数对应的名次}}return map;}/** 该方法可用于分数排名,购买量排名等排名计算* 描述  同分同名占名次,名次位置跳一位置  (调用入口)* 举例: 数据  [1,2,2,3,3]* 输出名次如下:* 第一名:3,3* 第二名;无   第二个人在第一名里 该位置空* 第三名:2,2* 第四名:无  第四个人在第三名 该位置空* 第五名:1** @param scoreList 进行排名的分数集合* @param score   需要查询分数所在的名次* @return java.util.List<java.util.Map < java.lang.String, java.lang.Integer>> 分数对应的名次* @author gx* @date 2022/5/10 10:45:04* @version 1.0*/public static Integer getRankByScore(List<Integer> scoreList, Integer score) {//分数倒序Collections.sort(scoreList, Collections.reverseOrder());Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < scoreList.size(); i++) {if (i == 0) {map.put(scoreList.get(0), (0 + 1));//分数对应的名次}if (!map.containsKey(scoreList.get(i))) {map.put(scoreList.get(i), (i + 1));//分数对应的名次}}return map.get(score);}/**  方法二  该方法可用于分数排名,购买量排名等排名计算* 描述  同分同名占名次,名次位置跳一位置  (调用入口)* 举例: 数据  [1,2,2,3,3]* 输出名次如下:* 第一名:3,3* 第二名;无   第二个人在第一名里 该位置空* 第三名:2,2* 第四名:无  第四个人在第三名 该位置空* 第五名:1** @param scoreList 进行排名的分数集合* @param startRank 开始名次* @param endRank   结束名次* @return java.util.List<java.util.Map < java.lang.String, java.lang.Integer>> 返回分数、分数对应的名次* @author gx* @date 2022/5/10 10:45:04* @version 1.0*/public static List<Map<String, Integer>> getScoreRankOneList(List<Integer> scoreList, Integer startRank, Integer endRank) {//分数倒序Collections.sort(scoreList, Collections.reverseOrder());//标记分数的名次(根据数组下标)List<Integer> rankList = tagScoreRank(scoreList);//封装返回的数据List<Map<String, Integer>> mapList = setScoreRankInfo(scoreList, rankList, startRank, endRank);//根据分数去重return mapList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()-> new TreeSet<>(Comparator.comparing(po->po.get("score")))), ArrayList::new));}private static List<Integer> tagScoreRank(List<Integer> scoreList) {//标记分数的名次List<Integer> rendks = new ArrayList<>();for (int i = 0; i < scoreList.size(); i++) {Integer item = scoreList.get(i);if (i != 0) {Integer upItem = scoreList.get(i - 1);if (upItem.equals(item)) {rendks.add(rendks.get(i - 1));} else rendks.add(i);} else {rendks.add(i);}}return rendks;}private static List<Map<String, Integer>> setScoreRankInfo(List<Integer> scoreList, List<Integer> rankList, Integer startRank, Integer endRank) {if (startRank < 0 || endRank < 0) throw new BusinessException(ResultEnum.ERROR, "输入名次不合法");List<Map<String, Integer>> resultList = new ArrayList<>();for (int i = startRank - 1; i <= endRank - 1 && i < rankList.size(); i++) {Integer score = scoreList.get(i);Map<String, Integer> map = new HashMap<>();map.put("score", score);//分数map.put(score.toString(), (rankList.get(i) + 1));//分数对应的名次resultList.add(map);}return resultList;}}

排名方法可用于分数排名,购买量排名等排名计算相关推荐

  1. 2021高考成绩一分段查询陕西省,2021年陕西高考一分一段表查询排名方法 成绩排名位次什么时候公布...

    陕西高考填报志愿最关键的第一步,就是在陕西高考一分一段表查询排名方法考生要在"一分一段表"中查找与自己成绩相对应的分数排名,以及这一位次的成绩共有多少考生,以此来确定个人成绩在全省 ...

  2. 2021年河北高考成绩位次怎么查询,2021年河北高考一分一段表查询排名方法 成绩排名位次什么时候公布...

    河北高考填报志愿最关键的第一步,就是在河北高考一分一段表查询排名方法考生要在"一分一段表"中查找与自己成绩相对应的分数排名,以及这一位次的成绩共有多少考生,以此来确定个人成绩在全省 ...

  3. SEO搜索引擎优化排名方法大全

    SEO搜索引擎优化排名方法大全 正确的搜索引擎优化可以有效的帮助网站得到正确的排名,仅此而已,这也是我写这篇文章的目的. 过度优化甚至作弊不但费时费力,而且对网站没有实际帮助. 提高在搜索引擎中排名的 ...

  4. 计算机中年级排名怎么操作,智学网如何查看年级排名 智学网看年级排名方法【详解】...

    智学网怎么看年级排名?智学网看年级排名方法.智学网是一个为学生提供学习课程与查看成绩.错题本.猜分数等功能的强大网站,现在已出了手机版,有很多朋友问智学网该怎么查看成绩排名呢?有两种方法,一种在网页上 ...

  5. 搜索引擎优化排名方法

    内容摘要: 从几个方面介绍Google排名因素,有效的页面优化因素,无效的页面优化因素,有效的页面外优化因素,无效的页面外优化因素,帮助您在提供网站服务时更好的展现网站,得到搜索引擎正确的评价. 关键 ...

  6. Google优化排名方法

    正确的搜索引擎优化可以有效的帮助网站得到正确的排名,仅此而已,这也是我写这篇文章的目的.过度优化甚至作弊不但费时费力,而且对网站没有实际帮助. 提高在搜索引擎中排名的最佳做法是提供优秀的有价值的内容. ...

  7. 2021年江苏高考成绩排名查询,2021年江苏高考一分一段表查询排名方法 成绩排名位次什么时候公布...

    江苏高考填报志愿最关键的第一步,就是在江苏高考一分一段表查询排名方法考生要在"一分一段表"中查找与自己成绩相对应的分数排名,以及这一位次的成绩共有多少考生,以此来确定个人成绩在全省 ...

  8. 全国计算机专业录取分数线排名,2020中国高校录取分数线排名全国大学录取分数线表...

    摘要: 2020中国高校录取分数线排名全国大学录取分数线表为你介绍2020年高考已经结束,各大学的录取分数线是多少?全国高校录取分数线排名情况如何?下文有途网小编给大家整理了... 2020年高考已经 ...

  9. 最新快速提升网站关键词排名方法,附案例

    快速排名,顾名思义,就是利用某些搜索引擎的特点对优化的网站进行特殊的优化操作,在短时间内达到排名迅速上升的目的.快速排名技术又分为黑帽SEO和白帽SEO 黑帽SEO我就不多说了,看名字就知道是作弊,这 ...

最新文章

  1. for循环的执行顺序
  2. 前端学习(2474):页面布局
  3. oracle启动文件是什么意思,Oracle数据库的启动——口令文件的作用
  4. 《深入理解分布式事务》第八章 TCC 分布式事务原理
  5. kotlin埋点_GitHub - shajinyang/ilvdo-event-track: 埋点框架
  6. python之6-1常用函数
  7. 让你的网页更精彩 - Javascript 调用MSAgent
  8. java 经纬度的距离计算工具包
  9. VS2008整合sp1
  10. 使用this.$refs.XXX修改某个元素样式并添加点击事件
  11. 最新架构amd服务器cpu,2015年或新变化?AMD将专注高性能架构
  12. team多网卡绑定、桥接的搭建、tcpdump抓包
  13. Warning: [antd: Form.Item] `defaultValue` will not work on controlled Field. You should use `initial
  14. 在Windows 2008中使用winvnc
  15. halcon印章文字提取
  16. hmmlearn源代码
  17. MFC不同窗口之间传递数据
  18. about oracle
  19. layui.layer 弹出层使用
  20. chrome谷歌浏览器执行js脚本步骤

热门文章

  1. 你知道国内有哪些网站提供免费的云服务器吗
  2. 【Arduino学习】01.开发板选择和环境的搭建
  3. Muse UI遇到的坑
  4. PHP高性能编程-提高PHP速度-加速PHP执行-PHP性能优化实践
  5. 巧用位运算实现大小写转换
  6. matplotlib learning-----案例:对比电影的票房收入(3)
  7. 华为mate40营销之我见
  8. iPhone 导入照片显示时间不是拍摄时间
  9. 晶振电路并联一个电阻作用
  10. 试算平衡表示例图_试算平衡表的编制步骤是什么?