华为OD机考 - 智能成绩表-多条件排序(JAVA 2025B卷)

在这里插入图片描述
在这里插入图片描述


public class ScoreTable {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String[] str = sc.nextLine().trim().split("\\s+");
            int n = Integer.parseInt(str[0]);// 学生人数
            int m = Integer.parseInt(str[1]);// 科目数
            String[] subjects = sc.nextLine().split("\\s+");//科目名称
            List<Student> students = new ArrayList<>(n);
            for(int i=0;i<n;i++){
                String[] split = sc.nextLine().split("\\s+");// 学生姓名 各科成绩
                String name = split[0];
                int[] scores = new int[m];
                for(int j=0;j<m;j++){
                    scores[j] = Integer.parseInt(split[j+1]);
                }
                students.add(new Student(name, scores));
            }
            String rankSubject = sc.nextLine().trim();// 需要排序的科目
            //System.out.println(rankSubject);
            if(Arrays.asList(subjects).contains(rankSubject)){// 包含排序科目
                students.sort((o1, o2) -> {
                    int index = Arrays.asList(subjects).indexOf(rankSubject);
                    if(o1.getScores()[index] == o2.getScores()[index]){
                        return o1.getName().compareTo(o2.getName());
                    }
                    return o2.getScores()[index] - o1.getScores()[index];
                });
            }else{// 不包含排序科目,则按总分降序排序,总分相同则按字母序升序排序
                students.sort((o1, o2) -> {
                    if(o1.getTotalScore() == o2.getTotalScore()){
                        return  o1.getName().compareTo(o2.getName());
                    }
                    return o2.getTotalScore() - o1.getTotalScore();
                });
            }
            StringBuilder sb = new StringBuilder();
            students.forEach(student -> {
                sb.append(student.getName()).append(" ");
            });
            System.out.println(sb.toString().trim());
        }
    }


    static class Student{
        String name;
        int[] scores;

        public Student(String name, int[] scores) {
            this.name = name;
            this.scores = scores;
        }

        public int getTotalScore(){
            int sum = 0;
            for(int i=0;i<scores.length;i++){
                sum += scores[i];
            }
            return sum;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int[] getScores() {
            return scores;
        }

        public void setScores(int[] scores) {
            this.scores = scores;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值