Loading

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

Java语言程序设计实训题目练习


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

思路:按照题目的意思,定义一个Student类,再重写一下toString方法,设计一个比较器,再将数据输入并排序输出,这题就结束了

import java.util.*;

public class object8 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<Student> stulist = new ArrayList<Student>();
        int n = sc.nextInt();
        for (int i = 0; i < n; i++)
            stulist.add(new Student(sc.next(), sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt()));
        Collections.sort(stulist, new MyComptor());
        for (Student stu : stulist)
            System.out.println(stu);
    }
}

class Student{
    String number;
    int cs, chinese, math, english, total;
    double avg;
    public Student(String number, int cs, int chinese, int math, int english) {
        this.number = number;
        this.cs = cs;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
        total = chinese + math + english;
        avg = total / 3.0;
    }
    public String toString() {
        return number+" "+cs+" "+chinese+" "+math+" "+english+" "+total+" "+String.format("%.2f", avg);
    }
}

class MyComptor implements Comparator<Object> {
    public int compare(Object o1, Object o2) {
        Student stu1 = (Student) o1;
        Student stu2 = (Student) o2;
        if ( stu1.total > stu2.total ) return -1;
        else if ( stu1.total < stu2.total ) return 1;
        else if ( stu1.chinese > stu2.chinese ) return -1;
        else if ( stu1.chinese < stu2.chinese ) return 1;
        else if ( stu1.math > stu2.math ) return -1;
        else if ( stu1.math < stu2.math ) return 1;
        else if ( stu1.english > stu2.english ) return -1;
        else if ( stu1.english < stu2.english ) return 1;
        else return 0;
    }
}

posted @ 2022-05-15 10:15  qing影  阅读(15)  评论(0)    收藏  举报  来源