Java语言程序设计期末实训考试范围练兵题-多关键字排序

该文描述了一个使用Java编程解决学生考试成绩排序的问题,通过面向对象方法创建Student对象,利用Collections.sort()进行排序,定义自定义比较器实现多关键字排序,首先按总分,然后按语文、数学、英语成绩依次排序。
摘要由CSDN通过智能技术生成

题目:

学生考试成绩的统计利用计算机软件将变得十份简单的事,由于你很勤奋,并且刚学习了面向对象程序设计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);
        }
    }
}


//我就是多次排序,没有使用集合,纯纯暴力了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值