Java HashMap排序与最优学生姓名成绩输出问题咨询
问题拆解与解决方案
嘿,我来帮你理清这些问题,然后把程序改成你想要的样子~
你的三个疑问解答
1. 为什么student.get(a)输出的是Integer类型值?
HashMap<String, Integer>的泛型已经明确了:键是String类型(学生姓名),值是Integer类型(成绩)。get(Object key)方法的作用是根据传入的键,返回对应的值。你循环结束后,变量a保存的是最后一个输入的学生姓名(比如你例子里的d),所以student.get(a)取到的就是这个学生的成绩,自然是Integer类型。
2. 换成b(Integer类型)作为参数时输出null?
还是HashMap的键值规则:你的HashMap里所有的键都是String类型的学生姓名,没有任何一个键是Integer类型的成绩。用b(成绩)作为键去查找,HashMap找不到匹配的键,就会返回null,这完全符合它的设计逻辑。
3. 如何同时输出最优学生的姓名与成绩?
你的现有代码有两个核心问题:
- 最后判断
if(b>4)只针对最后一个输入的学生,不是全班学生 - 你需要的是按成绩筛选+排序,而不是按姓名排序
下面是修正后的完整代码,我会加上注释说明:
import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.Scanner; public class StudentScore { public static void main(String[] args) { Scanner sc = new Scanner(System.in); HashMap<String, Integer> student = new HashMap<>(); System.out.println("Enter a number of students: "); int numberOfStudents = sc.nextInt(); // 这里不需要提前声明a和b,直接在循环里定义更清晰 for(int i=0; i<numberOfStudents; i++){ System.out.println("Enter a student's name:"); String name = sc.next(); System.out.println("Enter the student's score:"); int score = sc.nextInt(); student.put(name, score); } // 需求1:按成绩排序并输出所有学生信息(降序,成绩高的在前) System.out.println("\nAll students sorted by score (descending):"); student.entrySet() .stream() // 按成绩降序排序,如果要升序就去掉.reversed() .sorted(Map.Entry.<String, Integer>comparingByValue().reversed()) // 同时输出姓名和成绩 .forEach(entry -> System.out.println(entry.getKey() + " = " + entry.getValue())); // 需求2:找出成绩>4的最优学生(成绩最高的),并输出姓名+成绩 System.out.println("\nThe best student(s) with score >4:"); Optional<Map.Entry<String, Integer>> bestStudent = student.entrySet() .stream() // 筛选成绩大于4的学生 .filter(entry -> entry.getValue() > 4) // 找出成绩最高的那个 .max(Map.Entry.comparingByValue()); // 处理可能没有学生符合条件的情况(比如所有成绩都≤4) if (bestStudent.isPresent()) { Map.Entry<String, Integer> entry = bestStudent.get(); System.out.println(entry.getKey() + " with score " + entry.getValue()); } else { System.out.println("No student has score greater than 4."); } sc.close(); } }
额外说明
如果有多个学生成绩相同且都是最高(比如两个学生都考了5分),上面的代码只会输出其中一个。如果要输出所有同分的最优学生,可以把max换成以下逻辑:
// 找出成绩>4的学生中的最高分 Optional<Integer> maxScore = student.entrySet() .stream() .filter(entry -> entry.getValue() >4) .map(Map.Entry::getValue) .max(Integer::compare); if (maxScore.isPresent()) { int highest = maxScore.get(); System.out.println("All top students with score >4:"); student.entrySet() .stream() .filter(entry -> entry.getValue() == highest) .forEach(entry -> System.out.println(entry.getKey() + " = " + entry.getValue())); }
内容的提问来源于stack exchange,提问作者Vmir
相关产品推荐
相关产品推荐

