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

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

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;
    }
}
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);
        }
    }

}
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);
        }
    }
}
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该怎么写呢?

    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

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

    祝学习愉快~

    //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
    我在班级那边写了个平均数的方法,然后在学校那边遍历,为啥什么都不显示
    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;
    
    }
    //遍历学校集合
    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下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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