结构体排序------蓝桥杯

题目:给出 nn 个人的语文、数学、英语的成绩。你需要把他们的成绩降序输出。

排序的规则:先按总分排序,如果总分相等,就按语文成绩降序排序。如果语文成绩还相等。就按数学成绩降序排序,如果数学成绩还相等,就按姓名字典序升序排序。
输入
第一行是一个整数 n(1<=n<=1000)n(1<=n<=1000)。

接下来 nn 行,每行包括一个字符串 ss (由小写字母构成,长度不超过1010),以及x,y,z(0<=x,y,z<=100)x,y,z(0<=x,y,z<=100)。ss代表每个学生的姓名,x,y,zx,y,z分别代表语文,数学,英语的成绩。

输出
输出排序后每个人的信息,每个人的信息占一行。姓名,语文、数学、英语之间用一个空格隔开。
样例
输入
6
jing 2 3 5
ma 3 2 5
a 2 3 5
b 2 3 6
d 5 1 5
c 2 4 5
输出
d 5 1 5
c 2 4 5
b 2 3 6
ma 3 2 5
a 2 3 5

解决思路:
先构造结构体,结构体要涉及到学生的语数外,总成绩,名字。
然后再通过比较来得到排序。
Java代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class test6 {
    public static class Students implements Comparable{
        int Math;
        int English;
        int Chinese;
        String name;
        int sum;
        @Override
        public String toString() {
            return this.name+' '+this.Chinese+' '+this.Math+" "+this.English;
        }



        public int compareTo(Object o) {
            Students s= (Students) o;
            int m=this.name.compareTo(s.name);
            if (this.sum>s.sum){
                return 1;
            }else if(this.sum==s.sum&& this.Chinese>s.Chinese){
                return 1;
            }
            else if (this.sum==s.sum&& this.Chinese==s.Chinese && this.Math>s.Math){
                return 1;
            }
            else if (this.sum==s.sum&& this.Chinese==s.Chinese && this.Math==s.Math&&m<0){
              return 1;
            }
            return -1;

        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Students [] students = new Students[n];
        for (int i=0;i<n;i++){
            Students stu = new Students();
            stu.name=sc.next();
            stu.Chinese=sc.nextInt();
            stu.Math=sc.nextInt();
            stu.English=sc.nextInt();
            stu.sum=stu.Math+stu.Chinese+stu.English;
            students[i]=stu;
        }
        Arrays.sort(students);
        for (int i=n-1;i>=0;i--)
            System.out.println(students[i].toString());

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值