这一关感觉还没第三关难,思路很清晰
题目
1004 成绩排名
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n 第 2 行:第 1 个学生的姓名 学号 成绩 第 3 行:第 2 个学生的姓名 学号 成绩... ... ... 第 n+1 行:第 n 个学生的姓名 学号 成绩
其中
姓名
和学号
均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3 Joe Math990112 89 Mike CS991301 100 Mary EE990830 95
输出样例:
Mike CS991301 Joe Math990112
解题思路
- 首先,和第三关一样把值存在lis中然后去掉不相关第一条数据;
- 其次,参考样例把字符串在第二个空格出进行拆分,分为成绩和名字,放入map中;
- 最后,把成绩单独放入一个集合中排序,最后取最大最小值作为map的key取出姓名。
代码
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);scanner.useDelimiter("\n"); // 使用换行符作为分隔符List<String> inputList = new ArrayList<>();while (scanner.hasNext()) {String str = scanner.next().trim(); // 去除字符串前后的空格if (str.isEmpty()) {break; // 如果输入为空行,则结束循环}inputList.add(str);}inputList.remove(0);Map<String, String> scoreMap = new TreeMap<>();//使用Collections.reverseOrder()方法来创建一个比较器,该比较器按照整数的逆序进行排序。// Comparator.comparingInt(Integer::parseInt)是一个函数引用,它根据元素的整数值进行比较。Set<String> sortSet = new TreeSet<>(Collections.reverseOrder(Comparator.comparingInt(Integer::parseInt)));inputList.forEach(str -> {String name = "";String score = "";int firstSpaceIndex = str.indexOf(' ');if (firstSpaceIndex != -1) {int secondSpaceIndex = str.indexOf(' ', firstSpaceIndex + 1);if (secondSpaceIndex != -1) {//取字符串第二空格前数据name = str.substring(0, secondSpaceIndex);//取字符串第二个空格后数据score = str.substring(secondSpaceIndex + 1);}}scoreMap.put(score,name);sortSet.add(score);});//打印出最高成绩和最低成绩的名字System.out.println(sortSet);System.out.println(scoreMap.get(sortSet.toArray(new String[0])[0]));//因为是倒序所以第一个肯定是最大,最后(sortSet.size() - 1)为最小System.out.println(scoreMap.get(sortSet.toArray(new String[0])[sortSet.size() - 1]));}
}