Java实现分数转名次算法:去重排序与索引映射

Owen
Owen
发布时间:2026-10-13| 6人浏览过
原创

本文介绍如何在Java中将分数数组转换为名次数组。通过提取不重复元素、降序排序及索引查找,快速实现从原始分数到排名的映射。

实现原理

要实现“给出分数数组得到对应名次数组”的功能,需遵循以下逻辑步骤:

  1. 数据收集:遍历原始分数数组,将分数存入列表并去除重复值,确保每个分数只计算一次排名。
  2. 排序策略:将去重后的分数列表按降序排列。排名通常以高分者为前,因此5分高于4分,4分高于2分。
  3. 映射计算:再次遍历原始分数数组,查找每个分数在排序后列表中的位置(下标)。由于数组下标从0开始,而排名通常从1开始,因此最终名次 = 下标 + 1。

Java代码实现

以下是完整的Java实现示例,包含详细注释:

package test01;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ScoreRank {
    // 输出数组辅助方法
    public static void show(int[] s) {
        for (int x : s) System.out.print(x);
        System.out.println();
    }

    /**
     * 取得名次
     * @param score 原始分数数组
     * @return 对应的名次数组
     */
    public static int[] scoreRank(int[] score) {
        // 用于存储不重复的分数
        List lis = new ArrayList<>();
        
        // 1. 添加元素并去重
        for (int x : score) {
            if (!lis.contains(x)) {
                lis.add(x);
            }
        }
        
        // 2. 从小到大排序
        Collections.sort(lis);
        // 3. 反转列表,变为从大到小排序
        Collections.reverse(lis);
        
        int[] temp = new int[score.length];
        // 4. 计算每个原始分数的排名
        for (int i = 0; i < score.length; i++) {
            // indexOf返回的是0-based下标,排名需要+1
            temp[i] = lis.indexOf(score[i]) + 1;
        }
        return temp;
    }

    public static void main(String[] args) {
        // 测试数据:4, 2, 5, 4
        // 预期结果:分数5排名第1,分数4排名第2,分数2排名第3
        int[] score = {4, 2, 5, 4};
        
        int[] rank = scoreRank(score); // 取得名次
        
        System.out.print("原始分数:");
        show(score);
        System.out.print("对应名次:");
        show(rank);
    }
}

运行结果与分析

执行上述代码,控制台输出如下:

原始分数:4254
对应名次:2312

解析:

  • 输入:{4, 2, 5, 4}
  • 中间过程:
    • 去重后列表:[4, 2, 5]
    • 升序排序:[2, 4, 5]
    • 降序反转后:[5, 4, 2]
  • 映射计算:
    • score[0]=4:在降序列表中索引为1 → 排名 = 1 + 1 = 2
    • score[1]=2:在降序列表中索引为2 → 排名 = 2 + 1 = 3
    • score[2]=5:在降序列表中索引为0 → 排名 = 0 + 1 = 1
    • score[3]=4:在降序列表中索引为1 → 排名 = 1 + 1 = 2
  • 输出:{2, 3, 1, 2}

总结

该方案利用Java集合框架的特性,以较低的时间复杂度(主要取决于去重和排序步骤)解决了分数排名问题。对于大数据量场景,可进一步优化去重逻辑或考虑使用流式API(Stream API)进行代码精简。以上就是Java实现给出分数数组得到对应名次数组的详细内容,更多关于Java算法优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。