题目:给出 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());
}
}