如何基于分数对备选方案排名并输出名称与排名(Java示例)
方案排名实现(含同分处理)
这问题我熟,要实现根据分数给备选方案排名,核心是不能把名称和分数分开处理,否则排序后对应关系会乱。下面给你完整的可运行代码,包含同分并列排名的逻辑:
完整代码实现
import java.util.Arrays; import java.util.Comparator; public class Ranking { // 用Record绑定方案名称和分数(Java 16+支持,简洁高效) record Alternative(String name, double score) {} public static void main(String[] args) { // 备选方案的分数 double[] score = {6.75, 9.0, 6.75, 5.50}; // 备选方案的名称(补全你没写完的部分) String[] name = {"a1", "a2", "a3", "a4"}; // 1. 将名称和分数绑定成对象数组,避免排序后对应关系丢失 Alternative[] alternatives = new Alternative[name.length]; for (int i = 0; i < name.length; i++) { alternatives[i] = new Alternative(name[i], score[i]); } // 2. 按分数降序排序,分数高的排前面 Arrays.sort(alternatives, Comparator.comparingDouble(Alternative::score).reversed()); // 3. 计算排名并打印(处理同分并列) System.out.println("排名\t方案名称\t分数"); int currentRank = 1; double previousScore = alternatives[0].score(); for (int i = 0; i < alternatives.length; i++) { Alternative alt = alternatives[i]; // 处理分数不同的情况:更新排名为当前索引+1(索引从0开始) if (Math.abs(alt.score() - previousScore) > 1e-9) { currentRank = i + 1; previousScore = alt.score(); } // 格式化输出 System.out.printf("%d\t%s\t%.2f%n", currentRank, alt.name(), alt.score()); } } }
代码解释
- 数据绑定:用
Alternative这个Record把名称和分数绑定在一起,确保排序时两者不会分离。如果你的Java版本低于16,可以换成普通类(带getter的那种):
static class Alternative { private final String name; private final double score; public Alternative(String name, double score) { this.name = name; this.score = score; } public String getName() { return name; } public double getScore() { return score; } }
此时排序代码要改成:Arrays.sort(alternatives, Comparator.comparingDouble(Alternative::getScore).reversed());
排序逻辑:用
Arrays.sort结合Comparator实现分数降序排列,确保高分方案优先。同分排名处理:
- 初始化当前排名为1,记录第一个方案的分数
- 遍历排序后的数组,若当前方案分数和上一个不同(用
Math.abs避免浮点数精度误差),则更新排名为当前索引+1 - 同分的方案会保持相同排名,比如示例中a1和a3都会显示排名2,下一个方案直接跳至排名4,这是标准的竞赛排名规则。
运行输出
排名 方案名称 分数 1 a2 9.00 2 a1 6.75 2 a3 6.75 4 a4 5.50
内容的提问来源于stack exchange,提问作者Red One
相关产品推荐
相关产品推荐

