JAVA如何实现中式排名和美式排名
根据公司需求,需要编写中式和美式排名算法,根据具体业务编写的,代码如下,看不懂留言,欢迎探讨,求高手指教更高效稳定的方法。
private static int[] datas = {9,9,10,10,9,8,4,3,3,3,3,3,4,3,44,2,2,2,2,1};
public static void main(String[] args) {
    Map<String,String> map = new HashMap<>();
    for(int i = 0; i < 100; i ++){
        map.put(i + "",(int)(Math.random()*100)%3+",");
    }
   Map<String,String> map1 = orderByChPfSort(map);
    System.out.println("中式排名:");
    for(Map.Entry<String,String> entry : map1.entrySet()){
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
    System.out.println("美式排名:");
    Map<String,String> map2 = orderByPf(map);
    for(Map.Entry<String,String> entry : map2.entrySet()){
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
}
/**
 * 中式排名算法
 * @param map
 * @return
 */
private static Map<String,String> orderByChPfSort(Map<String, String> map){
    List<Map.Entry<String, String>> lists = new ArrayList<>(map.entrySet());
    //step1: 排序
    Collections.sort(lists, new Comparator<Map.Entry<String, String>>() {
        @Override
        public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
            String value1 = o1.getValue();
            String value2 = o2.getValue();
            int length1 = value1.split(",").length;
return Double.valueOf(value1.split(",")[length1-1]).compareTo(Double.parseDouble(value2.split(",")[length1-1]));
        }
    });
//step2:先给第一个数第一名的位置,
    //step3:再将后面的数与前一个数进行对比,如果大就获取前一个数的排名再加1,如果等于,就去前一个的排名给后面数
    Map<String,String> dataSort = new HashMap<>();
    int i = 0;
    String firstValue = "";
    String firstKey = "";
    for(Map.Entry<String, String> entry : lists){
        String value2 = entry.getValue();
        int length2 = value2.split(",").length;
        if(i == 0){
            dataSort.put(entry.getKey(), value2 + 1 + ",");
        }else{
            if(Double.parseDouble(value2.split(",")[length2 - 1]) > Double.parseDouble(firstValue.split(",")[length2-1])){
                dataSort.put(entry.getKey(),value2 + ((Integer.parseInt(dataSort.get(firstKey).split(",")[length2])) + 1) + ",");
            }else if((Double.parseDouble(value2.split(",")[length2 - 1]) == Double.parseDouble(firstValue.split(",")[length2-1]))){
                dataSort.put(entry.getKey(),value2 + (Integer.parseInt(dataSort.get(firstKey).split(",")[length2])) + ",");
            }
        }
        firstValue = value2;
        firstKey = entry.getKey();
        i++;
    }
    return dataSort;
}
/**
 * 评分美式排名方法
 *
 * @param map
 * @return
 */
private static Map<String, String> orderByPf(Map<String, String> map) {
    Map<String, String> zsPmMap = new TreeMap<>();
    //step1:遍历map
    for (Map.Entry<String, String> m : map.entrySet()) {
        int size = 1;
        String[] strsm = m.getValue().split(",");
        int lengthm = strsm.length;
        //step2:遍历map
        for (Map.Entry<String, String> m1 : map.entrySet()) {
            String[] strsm1 = m1.getValue().split(",");
            int lengthm1 = strsm1.length;
            //step3:将map中的每个值与其他值都对比一遍,如果有大于的就将排名数加1
            if (Double.parseDouble(strsm[lengthm - 1]) > Double.parseDouble(strsm1[lengthm1 - 1])) {
                size++;
            }
        }
        String value = "";
        //step4:重新给value设置值
        for (int i = 0; i <= lengthm - 1; i++) {
            value += (strsm[i] + ",");
            if (i == lengthm - 1) {
                value += (size + ",");
            }
        }
        //step5:将产生的包含排序值的数据重新添加到map中
        zsPmMap.put(m.getKey(), value);
    }
    return zsPmMap;
}
/**
 * 对数组进行中式拍寻
 */
private Map<Integer,String>  sortData(){
    //step1: 排序
    for(int i = 0; i < datas.length; i ++){
        for(int j = 0; j < datas.length; j ++){
            if(datas[i] < datas[j]){
                int mid = datas[i];
                datas[i] = datas[j];
                datas[j] = mid;
            }
        }
    }
    //step2:先给第一个数第一名的位置,
    //step3:再将后面的数与前一个数进行对比,如果大就获取前一个数的排名再加1,如果等于,就去前一个的排名给后面数
    Map<Integer,String> dataSort = new HashMap<>();
    for(int i = 0; i < datas.length ; i ++){
        if(i == 0){
            dataSort.put(i,datas[i] + "," + 1);
        }else{
            if(datas[i] > datas[i-1]){
                dataSort.put(i,datas[i] + "," + (Integer.parseInt(dataSort.get(i-1).split(",")[1]) + 1));
            }else if(datas[i] == datas[i-1]){
                dataSort.put(i,datas[i] + "," + (Integer.parseInt(dataSort.get(i-1).split(",")[1])));
            }
        }
    }
for (Map.Entry<Integer,String> entry : dataSort.entrySet()){
        System.out.print(entry.getKey() + ":" + entry.getValue());
        System.out.println();
    }
    return dataSort;
}
JAVA如何实现中式排名和美式排名的更多相关文章
- Java实现 蓝桥杯 算法提高 成绩排名
		
试题 算法提高 成绩排名 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明刚经过了一次数学考试,老师由于忙碌忘记排名了,于是老师把这个光荣的任务交给了小明,小明则找到了聪明的你, ...
 - TIOBE:全球编程语言最新排名(Kotlin排名进入前50名)
		
作为coder,大家当然关心自己所使用语言的应用趋势.要是几年后所用语言变得默默无闻,那岂不是之前的知识储备与经验积累都会大打折扣.TIOBE排行榜是根据互联网上有经验的程序员.课程和第三方厂商的数量 ...
 - Sql排名和分组排名
		
在很多时候,都有排名这个功能,比如排行榜,并且还需要分页的功能,一般可以再select的时候按照某一字段 oorder by XX desc,这样limit 查找就可以得到排名信息,但是有时候是需要多 ...
 - python爬虫学习(二):定向爬虫例子-->使用BeautifulSoup爬取"软科中国最好大学排名-生源质量排名2018",并把结果写进txt文件
		
在正式爬取之前,先做一个试验,看一下爬取的数据对象的类型是如何转换为列表的: 写一个html文档: x.html<html><head><title>This is ...
 - SQL Server排名函数与排名开窗函数
		
什么是排名函数?说实话我也不甚清楚,我知道 order by 是排序用的,那么什么又是排名函数呢? 接下来看几个示例就明白了. 首先建立一个表,随便插入一些数据. ROW_NUMBER 函数:直接排序 ...
 - Java实现 蓝桥杯VIP 算法提高 3000米排名预测
		
算法提高 3000米排名预测 时间限制:1.0s 内存限制:256.0MB 问题描述 3000米长跑时,围观党们兴高采烈地预测着最后的排名.因为他们来自不同的班,对所有运动员不一定都了解,于是他们分别 ...
 - HDOJ(HDU) 2093 考试排名(Arrays.sort排序、类的应用)
		
Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错 ...
 - HDU2093--考试排名
		
考试排名 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
 - HDU——2093考试排名(string类及其函数的运用以及istringstream)
		
考试排名 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
 
随机推荐
- 切比雪夫定理(Chebyshev's theorem)与经验法则(Empirical Rule)
			
切比雪夫定理(Chebyshev's theorem):适用于任何数据集,而不论数据的分布情况如何. 与平均数的距离在z个标准差之内的数值所占的比例至少为(1-1/z2),其中z是大于1的任意实数. ...
 - 您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8 密钥集不存在
			
支付宝突然报异常 您使用的私钥格式错误,请检查RSA私钥配置,charset = utf-8 经排查:系统日志 System.Security.Cryptography.CryptographicEx ...
 - TensorFlow安装笔记(CPU版)
			
新电脑配环境又出了问题. 先是装了最新版anaconda,python3.7的版本.——2019.10.21 然后conda install TensorFlow,conda install kera ...
 - itext7 html转pdf实现
			
公司最近做一个交易所项目,里面涉及一个需求就是将html模板,在填充数据后转换为pdf,这样防止数据更改,下面是具体实现 1 pom文件 <dependency> <groupId& ...
 - fiddler自动生成jmeter测试脚本
			
概述 昨天我们在课堂上讲了如何通过fiddler抓包,单一接口可以复制到jmeter中进行接口测试,那么如果抓包获取了大量的接口,我们如何快速实现接口转换成jmx文件呢? 今天给大家介绍fiddler ...
 - windows安装IIS不成功的原因
			
一.背景 之前做过一段时间的实施,因此总结一下IIS安装不成功会有哪些原因导致的,希望给踩坑的人提供思路和帮助. 二.分析原因 1.系统问题,比如Windows家庭版本(独白:我之前花了一天的时间安装 ...
 - [技术博客] gitlab快速部署流程
			
这里直接贴出少昂的个人博客链接:https://www.cnblogs.com/HansBug/p/9813627.html
 - java和vue2.0
			
1 java中的el表达式${对象.属性}和vue中的双向数据绑定{{mode.xx}}感觉有点类似 2 java中 request.setAttribute("hots", l ...
 - 【Python】解析Python中的文件操作
			
目录结构: contents structure [-] 简介 Python中的文件类型 内置函数的文件操作 open()函数 Mode 创建文本文件 读取文本文件 循环文件对象 关闭文件 With语 ...
 - SpringBoot Aop打印参数
			
import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf ...