学生考试成绩的统计利用计算机软件将变得十份简单的事,由于你很勤奋,并且刚学习了面向对象程序设计Java,在Java中提供了面向对象程序设计方法,并提供了大量有用的工具类,解决该问题你将成为能手,我们知道只要利用容器 Collections.sort()方法,很方便解决对象的排序问题,如果一个年级的学生参加了有语文、数学和英语三科目的考试,需要计算出每个学生的总分和平均成绩,并且要按照总分排序,如果总分相同,则依照语文、数学再英语的成绩排序,即排序关键词依次为总分、语文、数学、英语。请你设计一个程序解决该问题。
提示:利用输入数据的每行创建一个Student对象,将所有学生对象存储到一个List<Student> stulist = new ArrayList<Student>();线性表中,再利用Collections.sort(stulist,new MyComptor());就解决排序问题,然后将stulist中的每个学生输出,就完成该排序问题了,但为了能排序,Collections必须知道对象排序规则,要定义一个规则,是通过设计一个比较器完成,比较器的主体如下:
class MyComptor implements Comparator<Object> {
public int compare(Object o1, Object o2) {
Student stu1 =(Student)o1;
Student stu2 =(Student)o2;
if(...){//填写比较规则
return 1;
}else{
return 0;
}
}
}
下面是一个点对象排序的参考实例:
Point point2 = new Point(2,2,2);
Point point1 = new Point(1,1,1);
Point point3 = new Point(3,1,2);
List<Point> points = new ArrayList<Point>();
points.add(point2);
points.add(point1);
points.add(point3);
//根据point中的升序输出
Collections.sort(points, new SortByXdesc());
SortByXdesc对象的定义如下:
public class SortByXdesc implements Comparator<Object> {
//根据point中的x降序输出
@Override
public int compare(Object o1, Object o2) {
Point point1 =(Point)o1;
Point point2 =(Point)o2;
if(point1.getX()>point2.getX()){
return 1;
}else{
return 0;
}
}
}
标准输入:
第一行为一个正整数N,表示该年纪共有的学生数,接下来的N行,每行为一个学生的信息,依次为学号、班级、语文成绩、数学成绩和英语成绩,其中学号为10个字符的字符串,班级和成绩为正整数,他们之间由一个空格隔开。
标准输出:
输出该年级学生的成绩单,即根据总分和语文、数学、英语成绩为次关键词的排序后的成绩单,每行输出一个学生的成绩,使用一个空格隔开,依次输出如下数据:
学号 班级 语文 数学 英语 总分 平均
其中平均成绩四舍五入保留2位小数。
测试用例输入:
4
0806401001 1 56 64 77
0806401002 1 75 68 54
0806401003 1 68 79 76
0806401004 1 56 57 84
测试用例输出:
0806401003 1 68 79 76 223 74.33
0806401002 1 75 68 54 197 65.67
0806401001 1 56 64 77 197 65.67
0806401004 1 56 57 84 197 65.67
代码展示
import java.util.*;
public class Text17 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//因为学校的平台不支持jdk6以上的版本所以很多东西都不能用
//例如lambda表达式等,所以还是老老实实按老师教的去写
//创建学生对象的集合
ArrayList<Student>list = new ArrayList<Student>();
//接收输入的学生数据, 并添加到集合中
for(int i = 0; i < n; i ++){
Student stu = new Student(sc.next(), sc.nextInt(),
sc.nextInt(), sc.nextInt(), sc.nextInt());
list.add(stu);
}
//用集合中的sort方法对学生对象进行排序,
//排序时要定义自己的排序规则
//如49行及以下
Collections.sort(list, new MyCompareTo());
//排完序后进行输出
for (Student s : list) {
System.out.printf("%s %d %d %d %d %d %.2f \n",
s.id,s.cla,s.chinese,s.math,
s.english,s.score,s.avg);
}
}
}
class Student{
String id;
int cla;
int chinese;
int math;
int english;
int score;
double avg;
Student(String id,int cla, int chinese, int math, int english){
this.id = id;
this.cla = cla;
this.chinese = chinese;
this.math = math;
this.english = english;
score = chinese + math + english ;
avg = score / 3.0;
}
}
class MyCompareTo implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
//利用三元表达式进行操作,使代码更加简洁
int i = o2.score - o1.score;
i = i == 0 ? o2.chinese - o1.chinese : i;
i = i == 0 ? o2.math - o1.math : i;
i = i == 0 ? o2.english - o1.english : i;
// i > 0 表示进行升序排列
// i < 0 表示进行降序排列
return i;
}
}
两个注意点
1.写学生类的时候需要注意
将score ,avg赋值时需要放入到构造方法内
2.o1 代表的是已经存入的元素,o2 代表的是要存入的元素
这里的元素指的就是学生对象