Java实现分数转名次算法:去重排序与索引映射
本文介绍如何在Java中将分数数组转换为名次数组。通过提取不重复元素、降序排序及索引查找,快速实现从原始分数到排名的映射。
实现原理
要实现“给出分数数组得到对应名次数组”的功能,需遵循以下逻辑步骤:
- 数据收集:遍历原始分数数组,将分数存入列表并去除重复值,确保每个分数只计算一次排名。
- 排序策略:将去重后的分数列表按降序排列。排名通常以高分者为前,因此5分高于4分,4分高于2分。
- 映射计算:再次遍历原始分数数组,查找每个分数在排序后列表中的位置(下标)。由于数组下标从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 = 2score[1]=2:在降序列表中索引为2 → 排名 = 2 + 1 = 3score[2]=5:在降序列表中索引为0 → 排名 = 0 + 1 = 1score[3]=4:在降序列表中索引为1 → 排名 = 1 + 1 = 2
- 输出:
{2, 3, 1, 2}
总结
该方案利用Java集合框架的特性,以较低的时间复杂度(主要取决于去重和排序步骤)解决了分数排名问题。对于大数据量场景,可进一步优化去重逻辑或考虑使用流式API(Stream API)进行代码精简。以上就是Java实现给出分数数组得到对应名次数组的详细内容,更多关于Java算法优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













