这一关感觉还没第三关难,思路很清晰
题目
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]));
}
}