需要一个java程序

编写一个Java应用程序,定义一个一维数组定义存储10个学生名字,定义一个二维数组存储10个学生的3门课程(英语、高数、大学物理)成绩。
要求1:实现任意学生成绩的查询;
要求2:根据用户输入实现某一门课程的成绩从低到高排序;

啊,写了好几个小时,方法比较笨,你参考一下:


public class Test {
//定义几名学生
private static final String[] STUDENTS = {"张1", "张2", "张3", "张4", "张5"};
//定义课程名,课程号分别对应为数组下标 1,2,3...n+1,即英语的课程号为1,高数为2,以此类推,可以添加更多课程
private static final String[] CLASS_NAME = {"英语", "高数", "大物"};

public static void main(String[] args) {
//定义一个二维数组,模拟一份成绩单,其中第一列为学生的名字,后面几列分别代表各科成绩,
//数组大小为:学生人数 × (课程数 + 1)
String[][] grades = new String[STUDENTS.length][CLASS_NAME.length + 1];
for (int i = 0; i < STUDENTS.length; i++) {
grades[i][0] = STUDENTS[i];
//这里使用随机数来得到学生的成绩,你也可以直接定义一个写死的数组或者输入进去
for (int j = 1; j < CLASS_NAME.length + 1; j++) {
grades[i][j] = String.valueOf((int) (Math.random() * 100));
}
}


       //这里先把成绩单打印出来,并整理了格式
System.out.println("学生成绩单:");
System.out.println("[姓名|英语 高数 大物]");
for (int i = 0; i < STUDENTS.length; i++) {
System.out.print("[");
for (int j = 0; j < CLASS_NAME.length + 1; j++) {
if (j == 0) {
System.out.print(String.format("%-3s", grades[i][j]) + "|");
} else if (j < CLASS_NAME.length) {
System.out.print(String.format("%-3s", grades[i][j]) + " ");
} else {
System.out.print(String.format("%-3s", grades[i][j]));
}
}
System.out.print("]");
System.out.println("");
}


       //选择操作
System.out.println("----------------------");
System.out.println("请选择操作(1 - 任意学生成绩的查询;2 - 某一门课程的成绩从低到高排序):");
Scanner in = new Scanner(System.in);
int choose = in.nextInt();
if (choose == 1) {
System.out.println("请输入一个学生的名字:");
in = new Scanner(System.in);
String studentName = in.nextLine();
for (int i = 0; i < STUDENTS.length; i++) {
//将输入的学生姓名在成绩单第一列中比较,有该学生则输出其成绩
if (grades[i][0].equals(studentName)) {
System.out.println("学生[" + studentName + "]的成绩为:");
for (int j = 0; j < CLASS_NAME.length; j++) {
System.out.println(CLASS_NAME[j] + ":" + grades[i][j + 1]);
}
break;
}
if (i == STUDENTS.length - 1) {
System.out.println("无此学生成绩,请核对其姓名");
}
}


       } else if (choose == 2) {
System.out.println("请输入一门课程的名字:");
in = new Scanner(System.in);
String className = in.nextLine();
//因为涉及到二维数组的重新排序,我这里定义了一个内部类SortGradeHelper,
//你不喜欢内部类也可以把它单独拿出去弄成一个普通的类,类的定义和排序方式详见这个类
SortGradeHelper sortGrade = new SortGradeHelper();
if ("英语".equals(className)) {
grades = sortGrade.doSort(grades, 1);
} else if ("高数".equals(className)) {
grades = sortGrade.doSort(grades, 2);
} else if ("大物".equals(className)) {
grades = sortGrade.doSort(grades, 3);
} else {
System.out.println("无此课程");
return;
}


           //把新的成绩单打印出来
System.out.println("新的学生成绩单:");
System.out.println("[姓名|英语 高数 大物]");
for (int i = 0; i < STUDENTS.length; i++) {
System.out.print("[");
for (int j = 0; j < CLASS_NAME.length + 1; j++) {
if (j == 0) {
System.out.print(String.format("%-3s", grades[i][j]) + "|");
} else if (j < CLASS_NAME.length) {
System.out.print(String.format("%-3s", grades[i][j]) + " ");
} else {
System.out.print(String.format("%-3s", grades[i][j]));
}
}
System.out.print("]");
System.out.println("");
}
} else {
System.out.println("无效的选择!(1 - 任意学生成绩的查询;2 - 某一门课程的成绩从低到高排序)");
}
}


   //成绩排序小助手
static class SortGradeHelper {
private int sort; //顺序号
private int grade;//成绩
private SortGradeHelper[] sortGrades = new SortGradeHelper[STUDENTS.length];

SortGradeHelper() {
}

SortGradeHelper(int sort, int grade) {
this.sort = sort;
this.grade = grade;
}


       /*我这个二维数组排序的思想是:
1、首先将某一列排出来,比如英语成绩,则把英语这一列先拿出来排序
2、以刚刚排出来的这一列为标准,按照新的行序列,把原成绩单赋值给新成绩单返回
可能有点绕,我举个例子:
假设某成绩单为:
[姓名|英语 高数 大物]
[张1 |7   1   40 ]
[张2 |93  32  78 ]
[张3 |24  25  74 ]
[张4 |8   79  28 ]
[张5 |10  67  45 ]
按照英语进行排列,则先取出英语这一列,生成本类的this.sortGrades数组,该数组具体为:
{ new SortGradeHelper(0,7),
new SortGradeHelper(1,93),
new SortGradeHelper(2,24),
new SortGradeHelper(3,8),
new SortGradeHelper(4,10)
}
则可以看出本列的原顺序为:0,1,2,3,4
之后采用冒泡排序,按照英语成绩从小到大排序,则排序后的this.sortGrades数组为:
{ new SortGradeHelper(0,7),
new SortGradeHelper(3,8),
new SortGradeHelper(4,10),
new SortGradeHelper(2,24),
new SortGradeHelper(1,93)
}
这便得到了新的顺序:0,3,4,2,1
则成绩单所有行都将按照这个新的顺序排列,按照此顺序得到newGrades[][]数组返回
*/


       String[][] doSort(String[][] grades, int classNo) {
//按照课程号取出该课程这一列的成绩
for (int i = 0; i < STUDENTS.length; i++) {
this.sortGrades[i] = new SortGradeHelper(i, Integer.valueOf(grades[i][classNo]));
}
//冒泡排序
SortGradeHelper temp;
for (int i = 0; i < STUDENTS.length - 1; i++) {
for (int j = 0; j < STUDENTS.length - 1 - i; j++) {
if (this.sortGrades[j].grade > this.sortGrades[j + 1].grade) {
temp = this.sortGrades[j];
this.sortGrades[j] = this.sortGrades[j + 1];
this.sortGrades[j + 1] = temp;
}
}
}


           //按照新的顺序重新排列成绩单
String[][] newGrades = new String[STUDENTS.length][CLASS_NAME.length + 1];
for (int i = 0; i < this.sortGrades.length; i++) {
for (int j = 0; j < CLASS_NAME.length + 1; j++) {
newGrades[i][j] = grades[this.sortGrades[i].sort][j];
}
}

return newGrades;
}
}
}


我发的代码老是会挤到一起,所以我再把程序截图给你:

8-24行

25-41行

42-63行

64-80行

81-101行

102-114行

115-142行 对排序方法的注释和举例

143-159行

160-171行完


运行结果:

打印成绩:

成绩单排序:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-17
package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class test {
public static void main(String[] args) {
String[] names = new String[10];
double[][] sroce = new double[10][3];

for (int i = 0; i < 10; i++) {
System.out.println("输入第" + (i + 1) + "学生的姓名");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
try {
String name = bufferedReader.readLine();
names[i] = name;

for (int j = 0; j < 3; j++) {
switch (j) {
case 0:
System.out.println("请输入英语成绩");
break;
case 1:
System.out.println("请输入数学成绩");
break;
case 2:
System.out.println("请输入语文成绩");
break;
default:
break;
}
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
sroce[i][j] = Double.parseDouble(bufferedReader.readLine());

}
} catch (IOException e) {
e.printStackTrace();
}
}

System.out.println("请输入要排序的科目,1.英语,2 数学,3,英语");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
try {
int num = Integer.parseInt(bufferedReader.readLine());
num=num-1;

/*进行排序*/
double a =0;

for(int m=0 ;m<10;m++){
for (int n=0;n<(10-m-1);n++){
if(sroce[n][num]>sroce[n+1][num]){
//调换分数1
a =sroce[n][num];
sroce[n][num]=sroce[n+1][num];
sroce[n+1][num]=a;

//为保证下标一直,调换一维数组
String name = names[n];
names[n]=names[n+1];
names[n+1]=name;

}
}
}
for(String name :names){
System.out.println(name);
}
} catch (IOException e) {
e.printStackTrace();
}

}
}