2023华为od机试C卷【智能成绩表】Java 实现

题目描述

小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?

输入描述

第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()+" ");
		});
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值