题目:
学生考试成绩的统计利用计算机软件将变得十份简单的事,由于你很勤奋,并且刚学习了面向对象程序设计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.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] a = new String[n];
int b[][] = new int[n][5];
//输入
for (int i = 0;i < n;i ++){
a[i] = sc.next();
for (int j = 0;j < 4;j ++){
b[i][j] = sc.nextInt();
}
b[i][4] = b[i][1] + b[i][2] + b[i][3];
}
//比总分
for (int i = 0;i < n - 1;i ++){
for (int j = i + 1;j < n;j ++){
if (b[i][4] < b[j][4]){
String q = a[i];
a[i] = a[j];
a[j] = q;
int t[] = b[i];
b[i] = b[j];
b[j] = t;
}
}
}
//总分相同比语文
for (int i = 0;i < n - 1;i ++){
for (int j = i + 1;j < n;j ++){
if (b[i][4] == b[j][4]){
if (b[i][1] < b[j][1]){
String q = a[i];
a[i] = a[j];
a[j] = q;
int t[] = b[i];
b[i] = b[j];
b[j] = t;
}
}
}
}
//比数学
for (int i = 0;i < n - 1;i ++){
for (int j = i + 1;j < n;j ++){
if (b[i][4]==b[j][4]&&b[i][1]==b[j][1]){
if (b[i][2] < b[j][2]){
String q = a[i];
a[i] = a[j];
a[j] = q;
int t[] = b[i];
b[i] = b[j];
b[j] = t;
}
}
}
}
//比英语
for (int i = 0;i < n - 1;i ++){
for (int j = 0;j < n;j ++){
if (b[i][1]==b[j][1]&&b[i][2]==b[j][2]&&b[i][4]==b[i][4]){
String q = a[i];
a[i] = a[j];
a[j] = q;
int t[] = b[i];
b[i] = b[j];
b[j] = t;
}
}
}
//输出
for (int i = 0;i < n;i ++){
System.out.print(a[i] + ' ' );
System.out.printf("%d %d %d %d %d ",b[i][0],b[i][1],b[i][2],b[i][3],b[i][4]);
System.out.printf("%.2f\n",1.0*b[i][4]/3);
}
}
}
//我就是多次排序,没有使用集合,纯纯暴力了