题目描述
小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?
输入描述
第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10
第2行输入m个科目名称,彼此之间用空格隔开。科目名称只由英文字母构成,单个长度不超过10个字符。科目的出现顺序和后续输入的学生成绩一一对应。不会出现重复的科目名称。
第3行开始的n行,每行包含一个学生的姓名和该生m个科目的成绩(空格隔开),学生不会重名。学生姓名只由英文字母构成,长度不超过10个字符。成绩是0~100的整数,依次对应第2行中输入的科目。
第n+2行,输入用作排名的科目名称。若科目不存在,则按总分进行排序。
输出描述
输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。
示例1
输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 100 82
shuxue
输出:
xiaohua fangfang minmin
说明:
按shuxue成绩排名,依次是xiaohua、fangfang、minmin
示例2
输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen
输出:
fangfang minmin xiaohua
说明:
排序科目不存在,按总分排序,fangfang和minmin总分相同,按姓名的字典顺序,fangfang排在前面
java代码
package odTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
class Student{
private String name;
private int[] score;
public Student() {}
public Student(String name,int[] score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int[] getScore() {
return score;
}
public void setScore(int[] score) {
this.score = score;
}
}
public class IntellgectionScore {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] stuNumSci = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
List<String> sciList = Arrays.asList(scanner.nextLine().split(" "));
List<Student> studentList = new ArrayList<>();
for(int i=0;i<stuNumSci[0];i++) {
String[] studentInput = scanner.nextLine().split(" ");
Student student = new Student();
student.setName(studentInput[0]);
int[] score = Arrays.stream(Arrays.copyOfRange(studentInput, 1, stuNumSci[1]+1)).mapToInt(Integer::parseInt).toArray();
student.setScore(score);
studentList.add(student);
}
String inputSci = scanner.nextLine();
int sciIndex = sciList.indexOf(inputSci);
if(sciIndex == -1) {
Collections.sort(studentList,new Comparator<Student>() {
@Override
public int compare(Student arg0, Student arg1) {
int arg0ScoreSum = Arrays.stream(arg0.getScore()).sum();
int arg1ScoreSum = Arrays.stream(arg1.getScore()).sum();
if(arg1ScoreSum-arg0ScoreSum==0) {
return -arg1.getName().compareTo(arg0.getName());
}
return arg1ScoreSum-arg0ScoreSum;
}
});
}else {
Collections.sort(studentList,new Comparator<Student>() {
@Override
public int compare(Student arg0, Student arg1) {
int arg0Score = arg0.getScore()[sciIndex];
int arg1Score = arg1.getScore()[sciIndex];
if(arg1Score-arg0Score==0) {
return -arg1.getName().compareTo(arg0.getName());
}
return arg1Score-arg0Score;
}
});
}
studentList.forEach(student->{
System.out.print(student.getName()+" ");
});
}
}