Java中HashMap存储学生成绩需结合排序实现排名,因HashMap无序,须将entrySet转List后按成绩降序排序,再遍历输出并处理并列名次。

Java 中用 HashMap 存储学生成绩、再结合迭代器(如 entrySet().iterator())实现排名,本质是先聚合数据、再排序输出。但要注意:HashMap 本身无序,不能直接靠迭代器“自然”得到排名,必须借助额外排序逻辑。
用 HashMap 存储学生与成绩的映射关系
每个学生用唯一 ID(如学号)或姓名作 key,成绩(int/Double)作 value,适合快速查分、增删改。
- 推荐用
String作 key(如"S001"),避免姓名重复问题 - value 用
Double更灵活(支持小数成绩,如 89.5) - 示例:
Map<string double> scores = new HashMap();</string> - 添加数据:
scores.put("S001", 92.5); scores.put("S002", 87.0);
用迭代器遍历 + List 排序实现排名(推荐做法)
HashMap 的迭代器(Iterator<map.entry>></map.entry>)只保证遍历所有键值对,不保证顺序。要排名,需把 entry 转为 list 再按 score 降序排序。
- 将
scores.entrySet()转成ArrayList:List<map.entry double>> ranked = new ArrayList(scores.entrySet());</map.entry> - 用
Collections.sort()按成绩降序:Collections.sort(ranked, (a, b) -> Double.compare(b.getValue(), a.getValue())); - 再用迭代器遍历排序后的 list 输出名次:
Iterator<map.entry double>> it = ranked.iterator();</map.entry> - 遍历时用计数器记录名次(注意并列情况可选是否同名次)
处理并列排名(如两个 95 分都算第1名)
单纯按 score 排序后遍历,需手动判断分数是否变化来更新名次。
立即学习“Java免费学习笔记(深入)”;
- 初始化
int rank = 1,记录上一个分数Double lastScore = null - 遍历排序后的 entry list 时:
若entry.getValue().equals(lastScore),当前名次不变;
否则rank = 当前索引 + 1(或更严谨地用累计计数) - 常见写法:
if (!entry.getValue().equals(lastScore)) { rank = i + 1; lastScore = entry.getValue(); }
完整简版示例(含控制台输出)
以下代码可直接运行,演示从录入、排序到打印带名次的结果:
Map<String, Double> scores = new HashMap<>();
scores.put("S001", 92.5);
scores.put("S002", 87.0);
scores.put("S003", 92.5);
scores.put("S004", 81.0);
List<Map.Entry<String, Double>> list = new ArrayList<>(scores.entrySet());
list.sort((a, b) -> Double.compare(b.getValue(), a.getValue()));
System.out.println("学生成绩排名:");
int rank = 1;
Double last = null;
for (int i = 0; i < list.size(); i++) {
Map.Entry<String, Double> e = list.get(i);
if (last == null || !e.getValue().equals(last)) {
rank = i + 1;
last = e.getValue();
}
System.out.printf("%d. %s: %.1f分%n", rank, e.getKey(), e.getValue());
}
输出效果:
1. S001: 92.5分
1. S003: 92.5分
3. S002: 87.0分
4. S004: 81.0分


















