学生考试成绩的统计利用计算机软件将变得十份简单的事,由于你很勤奋,并且刚学习了面向对象程序设计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.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
Student[] stu=new Student[n+1];
for(int i=1;i<=n;i++){
String id=sc.next();
int cs=sc.nextInt();
int x1=sc.nextInt();
int x2=sc.nextInt();
int x3=sc.nextInt();
int total=x1+x2+x3;
double average=(double)total/3;
//实例化学生对象
stu[i]=new Student(id,cs,x1,x2,x3,total,average);
}
Comparator<Student> cmp=new MyComparator();
Arrays.sort(stu,1,1+n,cmp);
for(int i=1;i<=n;i++){
System.out.println(stu[i].toString());
}
}
}
class Student{
//学号
String id;
//cs为所在班级
int cs;
//x1,x2,x3分别对应了语,数,英
int x1,x2,x3;
//总分
int total;
//平均分
double average;
//创建有参构造器
public Student(String id, int cs, int x1, int x2, int x3, int total, double average) {
this.id = id;
this.cs = cs;
this.x1 = x1;
this.x2 = x2;
this.x3 = x3;
this.total = total;
this.average = average;
}
//每个学生的输出语句
@Override
public String toString() {
return id+" "+cs+" "+x1+" "+x2+" "+x3+" "+total+" "+String.format("%.2f",average);
}
}
//自定义比较方法
class MyComparator implements Comparator<Student>{
@Override
public int compare(Student a, Student b) {
if(b.total>a.total)return 1;
else if(b.total<a.total)return -1;
else if(b.x1>a.x1)return 1;
else if(b.x1<a.x1)return -1;
else if(b.x2>a.x2)return 1;
else if(b.x2<a.x2)return -1;
else if(b.x3>a.x3)return 1;
else if(b.x3<a.x3)return -1;
return 0;
}
}