请问老师,平均分排序问题该怎么做?

请问老师,平均分排序问题该怎么做?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package studentmanagement;
 
import java.util.Objects;
 
public class Student {
    private String stuNum;//学号
    private String stuName;//名字
    private float math;//数学分数
    private float chinese;//语文分数
 
    public Student(String stuNum, String stuName, float math, float chinese) {
        this.stuNum = stuNum;
        this.stuName = stuName;
        this.math = math;
        this.chinese = chinese;
    }
 
    /**
     * 判断学生是否存在
     * @param o 学生
     * @return  是否存在
     */
    @Override
    public boolean equals(Object o) {
    if(this==o){
        return true;
    }else{
        if(o.getClass()==Student.class){
            Student sd=(Student) o;
            return (sd.getStuNum().equals(stuNum))&&
                    (sd.getStuName().equals(stuName));
        }
    }
    return false;
    }
 
    @Override
    public String toString() {
        return "{" +
                "学生编号='" + stuNum + '\'' +
                ", 学生名字='" + stuName + '\'' +
                ", 数学成绩=" + math +
                ", 语文成绩=" + chinese +
                '}';
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(stuNum, stuName, math, chinese);
    }
 
    public String getStuNum() {
        return stuNum;
    }
 
    public void setStuNum(String stuNum) {
        this.stuNum = stuNum;
    }
 
    public String getStuName() {
        return stuName;
    }
 
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
 
    public float getMath() {
        return math;
    }
 
    public void setMath(float math) {
        this.math = math;
    }
 
    public float getChinese() {
        return chinese;
    }
 
    public void setChinese(float chinese) {
        this.chinese = chinese;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package studentmanagement;
 
import com.imooc.Player.PlayList;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
public class School {
    private Map<String,BanJi> schoolMap;//存放班级的集合
 
 
    public School() {
        schoolMap=new HashMap<String,BanJi>();
 
    }
 
    /**
     * 添加班级
     * @param banji
     */
    public void addBanji(BanJi banji){
        //添加班级,键对值:班级id,班级
        schoolMap.put(banji.getClassName(),banji);
    }
 
    /**
     * 删除班级
     * @param banji
     */
    public void deleteBanji(BanJi banji){
        System.out.println("您要删除的是:"+banji.getClassId()+"   "+banji.getClassName());
        schoolMap.remove(banji.getClassName());
        System.out.println("删除成功!");
    }
 
    /**
     * 通过班级名称查询班级
     * @param className 班级名称
     */
    public BanJi searchByName(String className) {
        BanJi banji=null;
        Set<String> banjiSet=schoolMap.keySet();
        for(String s:banjiSet){
            if(s.equals(className)){
                //如果查到了,储存到banji上
                banji=schoolMap.get(s);
                System.out.println("班级的id为:"+banji.getClassId()+"    班级的名字为:"+banji.getClassName());
                break;
            }
        }
        return banji;
//    }
    }
 
    /**
     *对各班语文成绩按平均分进行由大到小排序
     */
    public void sortChineseByAverage() {
 
    }
 
    /**
     *对各班数学成绩按平均分进行由大到小排序
     */
    public void sortMathByAverage() {}
 
    /**
     * 显示所有班级名称
     */
    public void displayBanJiName() {
        Set<String> schoolMapSet=schoolMap.keySet();
        System.out.println("现有班级为::");
        for(String s:schoolMapSet){
            System.out.println(s);
        }
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package studentmanagement;
 
import com.imooc.Player.Song;
 
import java.util.ArrayList;
import java.util.List;
 
public class BanJi {
    private String classId;//班级编号
    private String className;//班级名字
    private List<Student> stuList;//存放学生的集合
 
    public BanJi(String classId, String className) {
        this.classId = classId;
        this.className = className;
 
        stuList=new ArrayList<Student>();
    }
 
    public String getClassId() {
        return classId;
    }
 
    public void setClassId(String classId) {
        this.classId = classId;
    }
 
    public String getClassName() {
        return className;
    }
 
    public void setClassName(String className) {
        this.className = className;
    }
 
    public List getStuList() {
        return stuList;
    }
 
    public void setStuList(List stuList) {
        this.stuList = stuList;
    }
 
    /**
     * 将学生添加进班级
     * @param stu 学生
     */
    public void addStudent(Student stu){
        //判断是否存在
        Boolean flag=false;
        for(Student stu1:stuList){
            if(stu1.equals(stu)){
                flag=true;
                //System.out.println("添加失败,该学生已经存在!!");
                break;
            }
 
        }
        if(flag){
            System.out.println("添加失败,该学生已经存在!!");
        }else{
            stuList.add(stu);
            System.out.println("添加成功!");
        }
 
 
 
    }
 
    /**
     * 通过学号查询学生在班级中是否存在
     * @param stuNum 学号
     * @return  是否存在
     */
    public Student searchStudentByNum(String stuNum){
    Student sd=null;
 
        for(Student sd1:stuList){
             if(sd1.getStuNum()==stuNum){
                 //如果相等就找到了
                 sd=sd1;
                 break;
             }
        }
        return sd   ;
    }
 
    /**
     * 输入班级学生的语文成绩
     * @param stuNum 学生
     * @param score 语文成绩
     */
    public void insertChineseScore(String stuNum,float score){
 
 
        Student student1=searchStudentByNum(stuNum);
        if(student1!=null) {
        student1.setChinese(score);
            System.out.println("添加成功");
        }else{
            System.out.println("该学生不存在,请先添加");
        }
 
 
    }
 
    /**
     * 输入班级学生的数学成绩
     * @param stuNum    学生
     * @param score     数学成绩
     */
    public void insertMathScore(String stuNum,float score){
        Student student1=searchStudentByNum(stuNum);
        if(student1!=null) {
            student1.setMath(score);
            System.out.println("添加成功");
        }else{
            System.out.println("该学生不存在,请先添加");
        }
    }
 
    /**
     * 删除学生信息
     * @param stuNum 学生
     */
    public void deleteStudent(String stuNum){
        Student student2=searchStudentByNum(stuNum);
 
        if(student2!=null) {
            stuList.remove(student2);
            System.out.println("删除成功");
        }else{
            System.out.println("该学生不存在");
        }
 
 
    }
 
    /**
     * 显示所有学生信息(包括学号和名字)
     */
    public void displayAllStudent(){
        System.out.println("班级中所有学生信息为:");
        for(Student student:stuList){
            System.out.println(student);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package studentmanagement;
 
 
 
import java.util.ArrayList;
import java.util.List;
 
public class TestDemo {
 
 
 
 
    /**
     * 班级测试
     */
    public void testBanJi(){
        Student student1=new Student("s001","张三",50,60);
        Student student2=new Student("s002","李死",60,70);
        Student student3=new Student("s003","王五",70,80);
        Student student4=new Student("s004","老六",80,90);
 
        BanJi banji=new BanJi("a001","学前一班");
        banji.addStudent(student1);
        banji.addStudent(student2);
        banji.addStudent(student3);
        banji.addStudent(student4);
        //判断学生是否全部添加到班级里
        banji.displayAllStudent();
        {
            //测试删除方法
            banji.deleteStudent("s002");
            banji.displayAllStudent();
           }
        System.out.println("-----------------------");
        //通过编号查询信息
        System.out.println("查询到的信息为:"+banji.searchStudentByNum("s003"));
 
        System.out.println("-----------------------");
        //添加(修改)语文成绩和数学成绩
        banji.insertChineseScore("s001",99);
        banji.insertMathScore("s001",80);
        System.out.println("查询到的信息为:"+banji.searchStudentByNum("s001"));
 
 
    }
 
    /**
     * 学校测试
     */
    public void testSchool(){
        Student student1=new Student("s001","张三",50,60);
        Student student2=new Student("s002","李死",60,70);
        Student student3=new Student("s003","王五",70,80);
        Student student4=new Student("s004","老六",80,90);
        BanJi banji1=new BanJi("a001","一班");
        BanJi banji2=new BanJi("a002","二班");
        BanJi banji3=new BanJi("a003","三班");
        BanJi banji4=new BanJi("a004","四班");
 
        banji1.addStudent(student1);
        banji1.addStudent(student2);
        banji1.addStudent(student3);
        banji1.addStudent(student4);
 
        School sh = new School();
        sh.addBanji(banji1);
        sh.addBanji(banji2);
        sh.addBanji(banji3);
        sh.addBanji(banji4);
        //测试查找班级
        BanJi banJi1=sh.searchByName("四班");
        if(banJi1==null){
            System.out.println("班级不存在");
        }
        //删除班级
        sh.deleteBanji(banji2);
        //查看全部班级
        sh.displayBanJiName();
 
 
 
    }
    /**
     * 主菜单
     */
 
    public void mainMenu(){}
    /**
     * 学校管理菜单
     */
    public void schoolMenu(){}
 
    /**
     * 班级管理菜单
     */
    public void banJiMenu(){}
    /**
     * 主流程
    */
    public void test(){}
 
    public static void main(String[] args) {
        TestDemo td=new TestDemo();
//        td.testBanJi();
        td.testSchool();
    }
}

没思路了呀,不会写

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

    同学你好,老师这里给同学提供一些思路,同学可以参考着自己去实现一下。 

    首先,如果需要计算平均成绩,那么首先要保证各个班级中添加了学生,并且学生添加过成绩。

    那么在保证了学生已经添加过成绩时,可以将业务流程拆分成以下环节:

        一、将每个班级的所有学生成绩取出,并计算总成绩以便于计算平均成绩

        二、将班级信息以及平均成绩存储在集合中,以便于根据班级进行排序

        三、输出集合信息,展示排序后的结果。

    此时,再将以上三步进行拆解:

    第一步:

        1.需要遍历学校的集合,取出所有班级,这是一次集合的遍历;

        2.在上面的基础上,每次获取的班级中又有学生集合,那么再次获取学生集合,这也是一次集合的遍历;

        3.在遍历学生集合时,将学生成绩取出,并使用变量将成绩进行累加;

        4.计算该班级平均成绩,即总成绩除以学生集合的size;

        5.将班级信息和平均成绩进行存储,此时需要单独声明一个Map集合,key是班级信息(可以简单使用班级名称),value是班级的平均成绩。

    第二步:

        1.当第一步的学校集合遍历结束,各个班级及其平均成绩已经存储在第一步第5步的Map集合中了;

        2.将Map集合中所有的Entry对象取出,存放在List中;

        3.声明一个比较器,用于根据学生成绩进行排序。比较器中对比的是List集合中的Entry对象,比较规则是根据value进行排序;

        4.使用Collections工具类中的sort方法,将List集合进行排序。

    第三步:

        当完成上述步骤之后,List集合中的所有Entry对象已经根据班级信息进行了排序,可以进行输出展示了。

    以上就是根据平均成绩进行排序的思路,这里还有个小细节,就是主学生列表不应当参与排序,所以在遍历学校的班级列表时,主学生列表可以排除在外。

    同学可以根据上面的提示,自己尝试实现一下,如果还有问题,可以继续提问,

    祝学习愉快~


  • qq_慕妹9276277 提问者 #1

    请问老师 第一步的2和3该怎么写呢?

    1
    2
    3
    4
    5
    for(int i=0;i<schoolMap.size();i++){
        for( i=0;i<schoolMap.get(i).getStuList().size();i++){
         
        }
    }

    这样写循环是不是错了?没办法直接get学生数组的成绩

    2022-03-07 14:52:12
  • 好帮手慕小蓝 回复 提问者 qq_慕妹9276277 #2

    同学你好,仅计算平均分的话,同学可以参考下面的代码及注释。

    祝学习愉快~

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    //key为班级名称,value为平均分值
    Map<String, Float> score = new HashMap<String, Float>();
    //用于存储当前班级信息
    BanJi banJi = null;
    //用于存储当前班级中的学生列表
    List<Student> stuList = null;
    //用于存储当前班级分值
    float sum = 0.0f;
    //用于存储当前班级平均分
    float average = 0.0f;
    //得到所有班对应的班级名称,根据名称得到班级对象
    Set<String> nameSet = schoolMap.keySet();
    if (nameSet != null) {
        //遍历班级列表
        for (String s : nameSet) {
            if (s.equals("主学生列表"))
                continue;
            //每次循环将总分重置为0
            sum = 0.0f;
            //获取当前班级信息
            banJi = schoolMap.get(s);
            //获取班级中学生列表
            stuList = banJi.getStuList();
            if (stuList != null) {
                //遍历学生列表
                for (Student stu : stuList) {
                    sum = sum + stu.getChinese();
                }
                //求平均分
                average = sum / stuList.size();
                //将每个班级的平均分添加到列表score中
                score.put(banJi.getClassName(), average);
            else {
                System.out.println("该班级没有学生!");
            }
        }
    else {
        System.out.println("还未添加班级!");
    }


    2022-03-07 14:57:18
  • qq_慕妹9276277 提问者 #3
    我在班级那边写了个平均数的方法,然后在学校那边遍历,为啥什么都不显示
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public float getAvgChinese() {
        float sum=0.0f;
        //不能为空值
        if(stuList!=null) {
     
            for(int i=0; i<stuList.size(); i++) {
     
                sum+=stuList.get(i).getChinese();
     
            }
     
            this.avgChinese=sum/stuList.size();
     
        }
     
     
        return avgChinese;
     
    }
    1
    2
    3
    4
    5
    6
    7
    8
    //遍历学校集合
    for(int i=0;i<schoolMap.size();i++){
        if(schoolMap.get(i)!=null) {
            for (int n = 0; i < schoolMap.get(n).getStuList().size(); n++) {
                System.out.println(schoolMap.get(n).getAvgChinese());
            }
        }
    }


    2022-03-07 15:03:11
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码