小明所在班级一共有30个人,每个人必修语文、数学、外语,同时每人可选修0到5门课程(通过random确定每个同学随机选择的课程数量),请采用合理的数据结构存储该班级的成绩。同时 计算语文的平均成绩; 数学成绩的众数(出现次数最多的分数); 接受用户输入的学生学号(所在数组序号)查看其外语成绩在班级的排名 JAVA语言实现
时间: 2025-06-26 09:13:08 浏览: 12
为了存储小明所在的班级成绩信息,并完成题目中的功能需求,我们可以设计如下的解决方案。
### 数据结构的设计
1. **学生类** (`Student`):用于表示每位学生的个人信息及各科成绩。
- 属性包括:
- 学号 `id` (int)
- 姓名 `name` (String)
- 成绩 Map<String, Integer> 表示科目及其对应的成绩(键为科目名,值为成绩)
2. **班级类** (`Classroom`):用于管理所有学生的信息并提供查询功能。
- 属性包括:
- 班级列表 List<Student>
- 方法包括:
- 计算语文平均分;
- 找出数学成绩的众数;
- 根据学号查找某位学生的外语成绩排名;
以下是完整实现:
```java
import java.util.*;
public class Student {
private int id;
private String name;
private Map<String, Integer> scores; // 科目 -> 分数映射表
public Student(int id, String name) {
this.id = id;
this.name = name;
this.scores = new HashMap<>();
}
public void setScore(String subject, int score) {
if (!scores.containsKey(subject)) {
scores.put(subject, score);
} else {
System.out.println("此学科已存在!");
}
}
public int getScore(String subject){
return scores.getOrDefault(subject, 0); // 默认返回0如果不存在改课成绩
}
}
class Classroom{
private final static Random random = new Random();
private ArrayList<Student> students;
public Classroom() {
students = new ArrayList<>();
for(int i=0;i<30;i++){
addRandomStudent(i,"student"+i);
}
}
private void addRandomStudent(int id,String name){
Student student=new Student(id,name);
int[] subjectsCount={0,1,2,3,4,5};
Collections.shuffle(Arrays.asList(subjectsCount));
int selectedSubjects=random.nextInt(6)+1;//随机从0到5门额外课程
student.setScore("Chinese",random.nextInt(100));
student.setScore("Math",random.nextInt(100));
student.setScore("English",random.nextInt(100));
for(int j=0;j<selectedSubjects && selectedSubjects<=5 ;j++) {
switch(j){
case 1: student.setScore("Physics",random.nextInt(100)); break;
case 2: student.setScore("Chemistry",random.nextInt(100));break;
case 3: student.setScore("Biology",random.nextInt(100)); break;
case 4: student.setScore("History",random.nextInt(100)); break;
default : continue ;
}
}
students.add(student);
}
public double averageOfSubject(String subjectName){
double totalSum=students.stream()
.mapToInt(s-> s.getScore(subjectName))
.sum();
return totalSum / students.size();
}
public Optional<Integer> modeOfSubject(String subjectName){
var frequencyMap=new TreeMap<Integer,Integer>();
for(Student stud: students){
int value=stud.getScore(subjectName);
frequencyMap.merge(value,1,(oldValue,newValue)-> oldValue + newValue );
}
return frequencyMap.entrySet().stream().
max(Map.Entry.comparingByValue())
.map(entry-> entry.getKey());
}
public int rankInClassForSubject(Integer studentId , String subjectName ){
Comparator<Student> comparator=(a,b)->
b.getScore(subjectName).compareTo(a.getScore(subjectName));
PriorityQueue<Student> queue=
new PriorityQueue<>(comparator.reversed());
queue.addAll(students);
int index=-1;
while(!queue.isEmpty()){
index++;
Student topStud=queue.poll();
if(topStud instanceof Student &&
((Student)topStud).getId()==studentId.intValue()){
return index+1;
}
}
throw new IllegalArgumentException("无效的学生ID");
}
}
public class Main {
public static void main(String[] args) {
Classroom classroom=new Classroom();
Scanner scanner =new Scanner(System.in);
try{
System.out.println(classroom.averageOfSubject("Chinese"));
Optional<Integer> mathMode=classroom.modeOfSubject("Math");
if(mathMode.isPresent()){
System.out.println("数学成绩的众数值:"+mathMode.get());
}else{
System.out.println("无法找到数学成绩的众数");
}
System.out.print("请输入需要检查英语排名的学生学号:");
int targetId=scanner.nextInt();
System.out.printf("学生 %d 的英语排名是:%d\n",targetId,
classroom.rankInClassForSubject(targetId,"English"));
}finally{scanner.close();}
}
}
```
以上程序完成了三个关键的功能点:
1. 求语文平均分,
2. 数学成绩出现最多次的分数即“众数”,
3. 给定特定学号下该生在外语这方面的班级内排位情况,
其中利用了 Java 中的一些核心特性例如流操作 Stream 和优先队列 Priority Queue 来简化排序以及统计数据的过程。同时合理运用 map 进行快速存取和更新各个同学的不同选修课数目及得分状况。
阅读全文
相关推荐













