17 、(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.*;

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 代表的是要存入的元素

   这里的元素指的就是学生对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值