智能成绩表
2025-12-04 本文已影响0人
何以解君愁
小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?
输入描述:
第1行输入两个整数,学生人数n和科目数量m。0 < n < 100,0 < m < 10
第2行输入m个科目名称,彼此之间用空格隔开,科目名称只由英文字母构成,单个长度不超过10个字符。科目的出现顺字和后续输入的学生成绩一一对应。不会出现重复的科目名称。
第3行开始的行,每行包含一个学生的姓名和该生m个科目的成绩空格隔开),学生不会重名。 学生姓名只由英文字母构成,长度不超过10个字符。成绩是0~100的整数,依次对应第2行中输入的科目。
第n+2行,输入用作排名的科目名称。 若科目不存在,则按总分进行排序。
输出描述:输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//学生人数n和科目数量m
int n = sc.nextInt();
int m = sc.nextInt();
sc.nextLine();
String[] subjects = sc.nextLine().split("[ ]");
//n行学生,m+1列学生名+科目
String[][] perS = new String[n][m + 1];
for(int i = 0;i < n;i++){
for(int j = 0;j <m + 1;j++){
perS[i][j] = sc.next();
}
sc.nextLine();
}
//接收这个不知道存不存在的科目
String check = new String();
while(sc.hasNextLine()){
String s = sc.nextLine();
if(s.isEmpty() || s.equals(" ")){
break;
}
check = s;
}
// System.out.print(check.equals(""));//true
int index = Integer.MAX_VALUE;
for(int i = 0;i < m;i++){
if(check.equals(subjects[i])){
//记录这个索引的坐标
index = i;
break;
}
}
final int fixedIndex = index;
if(fixedIndex == Integer.MAX_VALUE){
//按总分排序
Arrays.sort(perS,(a,b)->{
int sumA = 0;
for (int i = 1; i < m + 1; i++) {
sumA += Integer.parseInt(a[i]);
}
int sumB = 0;
for (int i = 1; i < m + 1; i++) {
sumB += Integer.parseInt(b[i]);
}
if(sumA - sumB == 0){
return a[0].compareTo(b[0]);
}else{
return sumB - sumA;
}
});
}else{
//按科目排序
Arrays.sort(perS,(a,b)->{
int sumA = Integer.parseInt(a[fixedIndex + 1]);
int sumB = Integer.parseInt(b[fixedIndex + 1]);
if(sumA - sumB == 0){
return a[0].compareTo(b[0]);
}else{
return sumB - sumA;
}
});
}
for(int i = 0;i < n;i++){
System.out.print(perS[i][0] + " ");
}
}
}
扩展知识点
List<String> list = Arrays.asList("apple", "banana", "cat", "dog", "elephant");
Collections.sort(list, (a, b) -> {
// 先比较长度
int lengthCompare = Integer.compare(a.length(), b.length());
if (lengthCompare != 0) {
return lengthCompare; // 长度不同,按长度排序
}
// 长度相同,按字典序排序
return a.compareTo(b);
});
List<List<String>> listOfLists = Arrays.asList(
Arrays.asList("a", "b", "c"),
Arrays.asList("x", "y"),
Arrays.asList("m", "n", "o", "p"),
Arrays.asList("d", "e")
);
// 先按内部List的长度排序,再按第一个元素的字典序
Collections.sort(listOfLists, (list1, list2) -> {
int sizeCompare = Integer.compare(list1.size(), list2.size());
if (sizeCompare != 0) {
return sizeCompare;
}
// 长度相同,按第一个元素的字典序比较
return list1.get(0).compareTo(list2.get(0));
});