8 、(5分)多关键字排序

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值