算法

智能成绩表

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));
});



上一篇 下一篇

猜你喜欢

热点阅读