多关键字排序(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
代码:
当时写的
import java.util.Scanner;
class Xingyuxingxi{
public static void main(String[] args) {
int a;
Scanner sc=new Scanner(System.in);
a=sc.nextInt();
String []b=new String[a] ;
int []c=new int[a];
int []d=new int[a];
int []e=new int[a];
int []h=new int[a];
int []f=new int[a];
double []g=new double[a];
for(int i=0;i<a;i++)
{
b[i]=sc.next();
h[i]=sc.nextInt();
c[i]=sc.nextInt();
d[i]=sc.nextInt();
e[i]=sc.nextInt();
f[i]=c[i]+d[i]+e[i];
g[i]=1.0*f[i]/3;
}
for(int i=0;i<a-1;i++)
{
for(int j=0;j<a-i-1;j++)
{
if(e[j]<e[j+1])
{
String t1=b[j];
b[j]=b[j+1];
b[j+1]=t1;
int t2=c[j];
c[j]=c[j+1];
c[j+1]=t2;
t2=h[j];
h[j]=h[j+1];
h[j+1]=t2;
t2=d[j];
d[j]=d[j+1];
d[j+1]=t2;
t2=e[j];
e[j]=e[j+1];
e[j+1]=t2;
t2=f[j];
f[j]=f[j+1];
f[j+1]=t2;
double t3=g[j];
g[j]=g[j+1];
g[j+1]=t3;
}
}
}
for(int i=0;i<a-1;i++)
{
for(int j=0;j<a-i-1;j++)
{
if(d[j]<d[j+1])
{
String t1=b[j];
b[j]=b[j+1];
b[j+1]=t1;
int t2=c[j];
c[j]=c[j+1];
c[j+1]=t2;
t2=h[j];
h[j]=h[j+1];
h[j+1]=t2;
t2=d[j];
d[j]=d[j+1];
d[j+1]=t2;
t2=e[j];
e[j]=e[j+1];
e[j+1]=t2;
t2=f[j];
f[j]=f[j+1];
f[j+1]=t2;
double t3=g[j];
g[j]=g[j+1];
g[j+1]=t3;
}
}
}
for(int i=0;i<a-1;i++)
{
for(int j=0;j<a-i-1;j++)
{
if(c[j]<c[j+1])
{
String t1=b[j];
b[j]=b[j+1];
b[j+1]=t1;
int t2=c[j];
c[j]=c[j+1];
c[j+1]=t2;
t2=h[j];
h[j]=h[j+1];
h[j+1]=t2;
t2=d[j];
d[j]=d[j+1];
d[j+1]=t2;
t2=e[j];
e[j]=e[j+1];
e[j+1]=t2;
t2=f[j];
f[j]=f[j+1];
f[j+1]=t2;
double t3=g[j];
g[j]=g[j+1];
g[j+1]=t3;
}
}
}
for(int i=0;i<a-1;i++)
{
for(int j=0;j<a-i-1;j++)
{
if(f[j]<f[j+1])
{
String t1=b[j];
b[j]=b[j+1];
b[j+1]=t1;
int t2=c[j];
c[j]=c[j+1];
c[j+1]=t2;
t2=h[j];
h[j]=h[j+1];
h[j+1]=t2;
t2=d[j];
d[j]=d[j+1];
d[j+1]=t2;
t2=e[j];
e[j]=e[j+1];
e[j+1]=t2;
t2=f[j];
f[j]=f[j+1];
f[j+1]=t2;
double t3=g[j];
g[j]=g[j+1];
g[j+1]=t3;
}
}
}
for(int i=0;i<a;i++)
{
System.out.println(b[i]+" "+h[i]+" "+c[i]+" "+d[i]+" "+e[i]+" "+f[i]+" "+String.format("%.2f",g[i]));
}
}
}
//6
//0001 1 1 2 3 6 2
//0002 1 2 1 3
//0003 1 3 2 1
//0004 1 2 3 1
//0005 1 3 1 2
//0006 1 1 3 2