题目描述:
小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?
输入描述:
第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排在前面
代码
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();//学生数
int m = in.nextInt();//学科数
in.nextLine();
//学科集合
String[] projects = in.nextLine().split(" ");
String[] str = new String[n];//学生以及成绩
for (int i = 0; i < n; i++) {
str[i] = in.nextLine();
}
String project = in.next();//需要查询排名的学科,没有即为总分
int index=-1;//需要排序的学科下标
for (int i = 0; i <projects.length; i++) {
if (projects[i].equals(project)) {
index=i;
}
}
//需要进行排序的学生以及对应的成绩或总分
Map<String,Integer> map = new HashMap<String,Integer>();
for (int i = 0; i < n; i++) {
String[] s=str[i].split(" ");
String name=s[0];
int value=0;
if(index==-1){
for(int j=1;j<s.length;j++){
value+=Integer.parseInt(s[j]);
}
}else{
value=Integer.parseInt(s[index+1]);
}
map.put(name,value);
}
//map集合排序
List<Map.Entry<String,Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if(o1.getValue()== o2.getValue()){
return o2.getKey().compareTo(o1.getKey());
}
return o2.getValue()-(o1.getValue());
}
});
for(Map.Entry<String,Integer> s:list){
System.out.print(s.getKey()+" ");
}
}
}