如何使用Java Scanner输入数值与用户名,实现仅展示前10名的得分排名功能
排名展示功能实现方案
要求排名格式为
int(分值) - String(用户名),最多输出前10名结果
问题原因
- 现有代码将分值和用户名存储在两个独立的ArrayList中,无法建立一一对应关系
- 输入逻辑错误:先读取了一个double类型的组数后直接读取了一个用户名,后续循环仅录入分值,没有对应录入每组的用户名
修复后完整代码
import java.util.*; import java.util.AbstractMap.SimpleEntry; public class Methods { // 红字体输出常量,如果你原有定义可以直接复用 private static final String ANSI_RED = "\u001B[31m"; private static final ArrayList<SimpleEntry<Double, String>> scoreUserList = new ArrayList<>(); public static void test() { try (Scanner scanner = new Scanner(System.in)) { System.out.print(ANSI_RED + "请输入要录入的总组数:"); // 组数为整数,不要用double类型接收 int totalCount = scanner.nextInt(); scanner.nextLine(); // 处理换行符残留问题,避免后续字符串读取出错 for (int i = 0; i < totalCount; i++) { System.out.printf("请输入第%d组的用户名:", i+1); String username = scanner.nextLine(); System.out.printf("请输入第%d组的分值:", i+1); double score = scanner.nextDouble(); scanner.nextLine(); scoreUserList.add(new SimpleEntry<>(score, username)); } System.out.println("------------"); System.out.println("排名结果:"); // 按分值倒序排序,取前10,按要求格式输出 scoreUserList.stream() .sorted((o1, o2) -> Double.compare(o2.getKey(), o1.getKey())) .limit(10) .toList() .forEach(entry -> System.out.printf("%d - %s%n", entry.getKey().intValue(), entry.getValue())); // 你原有实现的retry方法保留即可 // retry(); } } public static void main(String[] args) { test(); } }
核心改动说明
- 使用
SimpleEntry<Double, String>存储分值和用户名的关联数据,避免两个列表错位导致的匹配错误 - 修正输入逻辑:先读取总组数,循环每组依次录入用户名和分值,处理Scanner换行符残留问题避免输入报错
- 排序后调用
limit(10)实现最多输出前10名的需求 - 输出时将分值强转为int类型,完全符合要求的格式规范
内容的提问来源于stack exchange,提问作者user16386411
相关产品推荐
相关产品推荐

