本文主要是介绍智能成绩表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?
输入描述
第 1行输入两个整数,学生人数n和科目数量 m。
- 0<n<100
- 0<m<10
第 2 行输入 m 个科目名称,彼此之间用空格隔开
- 科目名称只由英文字母构成,单个长度不超过10个字符。
- 科目的出现顺序和后续输入的学生成绩--对应。
- 不会出现重复的科目名称。
第3行开始的n行,每行包含一个学生的姓名和该生m 个科目的成绩(空格隔开)
- 学生不会重名。
- 学生姓名只由英文字母构成,长度不超过10个字符,
- 成绩是0~100的整数,依次对应第2行种输入的科目,
第n+2行,输入用作排名的科目名称。若科目不存在,则按总分进行排序。
输出描述
输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。
public class 智能成绩表 {public static String jifenkemu;static class Student implements Comparable<Student>{String name;Map<String, Integer> projects;int tot = 0;public Student(String name) {this.name = name;this.projects = new HashMap<>();}public void add(String project, int score){projects.put(project, score);tot += score;}@Overridepublic int compareTo(Student o) {int p = tot;int p1 = o.tot;if (projects.containsKey(jifenkemu)){p = projects.get(jifenkemu);p1 = projects.get(jifenkemu);}if (p != p1){return p1 - p;}else {return name.compareTo(o.name);}}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();sc.nextLine();String[] projests = sc.nextLine().split(" ");ArrayList<Student> students = new ArrayList<>();for (int i = 0; i < n; i++) {String name = sc.next();Student student = new Student(name);for (int j = 0; j < m; j++) {int so = sc.nextInt();student.add(projests[j], so);}students.add(student);}jifenkemu = sc.next();Collections.sort(students);for (Student student: students){System.out.println(student.name + " ");}}
}
这篇关于智能成绩表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!