程序编译不报错,运行不报错,就是不执行某个地方

程序编译不报错,运行不报错,就是不执行某个地方

这是测试类
public class TestDemo {
	Scanner stdIn=new Scanner(System.in);
	School school=new School();
	//方法一:主菜单
    public void mainMenu(){
    	System.out.println("***********************************");
    	System.out.println("          **主菜单**");
    	System.out.println("          1--班级管理");
    	System.out.println("          2--学校管理");
    	System.out.println("          0--退出");
    	System.out.println("***********************************");
    }
    
    //方法二:班级管理菜单
    public void banjiMenu(){
    	System.out.println("********************************************");
    	System.out.println("              **班级管理**");
    	System.out.println("              1--添加学生信息到主学生列表");
    	System.out.println("              2--添加学生信息到普通班级");
    	System.out.println("              3--通过学号查询学生信息");
    	System.out.println("              4--输入班级的语文成绩");
    	System.out.println("              5--输入班级的数学成绩");
    	System.out.println("              6--删除学生信息");
    	System.out.println("              7--显示所有学生信息");
    	System.out.println("              9--返回上一级菜单");
    	System.out.println("********************************************");
    }
    
    //方法三:学校管理菜单
    public void schoolMenu(){
    	System.out.println("***********************************");
    	System.out.println("           1--创建班级");
    	System.out.println("           2--删除班级");
    	System.out.println("           3--通过班级名称查询班级信息");
    	System.out.println("           4--对各班语文成绩按平均分进行由大到小排序");
    	System.out.println("           5--对各班数学成绩按平均分进行由大到小排序");
    	System.out.println("           6--显示所有班级名称");
    	System.out.println("           9--返回上一级菜单");
    	System.out.println("***********************************");
    }
    
    //方法四:班级的测试方法
    public void testBanji(){
    	TestDemo td=new TestDemo();
    	Banji banji=new Banji("b001","主学生列表");  //主学生列表作为一个特殊的班级存在
    	school.addBanji(banji);
    	Outer:
    	while(true){
    	td.banjiMenu();
    	System.out.println("请输入对应的数字对班级进行管理:");
    	Inner:
    		while(true){
    	int w=stdIn.nextInt();
    	if(w==9){
    		td.test();
    		break Outer;
    	}
    	switch(w){
    	case 1:System.out.println("添加学生信息到主学生列表");
    	       System.out.println("请输入要添加的学生的数量:");
    	       int e=stdIn.nextInt();
    	       for(int i=1;i<=e;i++){
    	    	   System.out.println("请输入第"+i+"个学生信息:");
    	    	   System.out.println("请输入学号:");
    	    	   String id=stdIn.next();
    	    	   System.out.println("请输入学生姓名:");
    	    	   String name=stdIn.next();
    	    	   Student stu=new Student(id,name);
    	    	   banji.addStudent(stu);
    	       }
    	       System.out.println("主学生列表的学生信息如下:");
    	       banji.displayAllStudent();
    	       break Inner;
    	case 2:System.out.println("添加学生信息到普通班级");
    	       System.out.println("请输入要将学生添加到的班级名称:");
    	       String banjiName=stdIn.next();
    	       Banji banji2=school.searchByName(banjiName);
    	       if(banji2==null){
    	    	   System.out.println("亲,该班级不存在哟,赶快去添加吧。");break Inner;
    	       }else{
    	    	   System.out.println("请输入要添加的学生的数量:");
        	       int y=stdIn.nextInt();
        	       for(int i=1;i<=y;i++){
        	    	   System.out.println("请输入第"+i+"个学生信息:");
        	    	   System.out.println("请输入学号:");
        	    	   String id=stdIn.next();
        	    	   //通过学生ID查询主学生列表中是否存在该ID的学生
        	    	   Student stu2=banji.searchStudentByNum(id);
        	    	   if(stu2==null){
        	    		   System.out.println("该学生在主学生列表中不存在,请继续添加学生的其他信息:");
        	    		   System.out.println("请输入学生姓名:");
            	    	   String name=stdIn.next();
            	    	   Student stu21=new Student(id,name);
            	    	   banji.addStudent(stu21);
            	    	   banji2.addStudent(stu21);
            	    	   System.out.println("添加完成。");
        	    	   }else{
        	    		   banji2.addStudent(stu2);
        	    		   System.out.println("添加完成。");
        	    	   }
        	    	   
        	       }
    	       }
    	       break Inner;
    	case 3:System.out.println("通过学号查询学生信息");  break Inner;
    	case 4:System.out.println("输入班级的语文成绩");   break Inner;
    	case 5:System.out.println("输入班级的数学成绩");   break Inner;
    	case 6:System.out.println("删除学生信息");      break Inner;
    	case 7:System.out.println("显示所有学生信息");  break Inner;
    	default:System.out.println("您的输入超出范围,请重新输入:");  continue Inner;
    	  }
    	 }
    	}
    }
    
    //方法五:学校的测试方法
    public void testSchool(){
    	TestDemo td=new TestDemo();
    	int t=0;
    	Outer:
    	while(true){
    	td.schoolMenu();
    	System.out.println("请输入对应的数字对学校进行管理:");
    	Inner:
    		while(true){
    	t=stdIn.nextInt();
    	if(t==9){
    		td.test();
    		break Outer;
    	 }
    	switch(t){
    	case 1:System.out.println("创建班级");
    	       System.out.println("请输入要创建的班级id:");
    	       String banjiId=stdIn.next();
    	       System.out.println("请输入要创建的班级名称:");
    	       String banjiName=stdIn.next();
    	       Banji banji1=new Banji(banjiId,banjiName);
    	       school.addBanji(banji1);
    	       break Inner;
    	case 2:System.out.println("删除班级");   break Inner;
    	case 3:System.out.println("通过班级名称查询班级信息");   break Inner;
    	case 4:System.out.println("对各班语文成绩按平均分进行由大到小排序");  break Inner;
    	case 5:System.out.println("对各班数学成绩按平均分进行由大到小排序");  break Inner;
    	case 6:System.out.println("显示所有班级名称");
    	       school.displayBanjiName();
    	       break Inner;
    	default:System.out.println("您的输入超出范围,请重新输入:");   continue Inner;
    	}
       }
    }
    }
    
    //方法六:主流程
    public void test(){
    	TestDemo td=new TestDemo();
    	int q=0;
    	Outer:
    	while(true){
    	td.mainMenu();
    	System.out.println("请输入对应数字进行操作:");
    	Inner:
    	while(true){
    	q=stdIn.nextInt();
    	if(q==0){
    		break Outer;
    	}
    	switch(q){
    	case 1:td.testBanji();break Outer;
    	case 2:td.testSchool();break Outer;
    	default:System.out.println("您的输入超出范围,请重新输入:");continue Inner;
    	 }
    	 }
    	}
    	
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestDemo td=new TestDemo();
		td.test();

	}

}

这是学校类
public class School {
    private Map<String,Banji> schoolMap; //存放班级的集合   班级名称作为key值,班级信息作为value值
    
    //构造方法
    public School(){
    	schoolMap=new HashMap<String,Banji>();
    }
    
    //封装
	public Map<String, Banji> getSchoolMap() {
		return schoolMap;
	}

	public void setSchoolMap(Map<String, Banji> schoolMap) {
		this.schoolMap = schoolMap;
	}
    
	/**
	 * 方法一:添加班级
	 * @param banji  要添加的班级
	 */
	public void addBanji(Banji banji){
		//班级名称作为key值
		schoolMap.put(banji.getClassName(), banji);
	}
	
	/**
	 * 方法二:删除班级
	 * @param banji  要删除的班级
	 */
	public void deleteBanji(Banji banji){
		schoolMap.remove(banji.getClassName());
		System.out.println("删除成功。");
	}
	
	/**
	 * 方法三:通过班级名称查询班级 
	 * @param className  要查询的班级的名称
	 * @return    被查询的班级信息
	 */
	public Banji searchByName(String className){
		Banji banji=null;
		System.out.println("----1313");
		Set<String> banjiSet=schoolMap.keySet();
		     for(String banji3:banjiSet){
		    	 System.out.println("----1414");
		    	 if(banji3.equals(className)){
		    		 System.out.println("----1515");
		    		 banji=schoolMap.get(banji3);
		    		 break;
		    	 }
		     }
		     return banji;
	}
	
	/**
	 * 方法四:对各班语文成绩按平均分进行由大到小排序
	 */
	public void sortChineseByAverage(){
		//使用Map集合存放班级语文成绩平均分,班级名称作为key值,平均分作为value值
		Map<String,Float> banjiMap=new HashMap<String,Float>();
		Banji banji=null;
		Set<String> banjiName=schoolMap.keySet();   //获取班级名称的集合
		for(String s:banjiName){                  //使用增强型for循环遍历班级名称集合
			banji=this.searchByName(s);        //确认班级是否存在
			if(banji==null){
				System.out.println("该班级不存在。");break;
			}else{
				float chinese1=0.0f;
				int m=0;
			//System.out.println(s+"的平均分:");    //某班
			List<Student> ls=banji.getStuList();       //获取班级类中存放学生的集合
			Iterator <Student> stu=ls.iterator();      //使用迭代器循环遍历学生
			   while(stu.hasNext()){                    //使用while循环遍历学生的语文成绩
				   chinese1+=stu.next().getChinese();
				   m++;
			   }
			   chinese1=chinese1/m;
			   banjiMap.put(s, chinese1);  
			}
		}
		List<Map.Entry<String,Float>> lm=new ArrayList<Map.Entry<String,Float>>(banjiMap.entrySet());
		Collections.sort(lm, new Comparator<Map.Entry<String,Float>>(){
			//降序排序
			public int compare(Entry<String,Float> o1,Entry<String,Float> o2){
				return o2.getValue().compareTo(o1.getValue());
			}
		});
		    for(Map.Entry<String, Float> mes:lm){
		    	System.out.println(mes.getKey()+"的平均分:"+mes.getValue());
		    }
			}
	/**
	 * 方法六:显示所有班级名称
	 */
	public void displayBanjiName(){
		Set<String> banjiName=schoolMap.keySet();
		for(String s:banjiName){
			System.out.println(s);
		}
	}
	}
	
班级类
public class Banji {
     //班级编号   班级名称  存放学生的集合
	private String classId;
	private String className;
	private List<Student> stuList;
	
	//带参构造方法
	public Banji(String classId,String className){
		this.setClassId(classId);
		this.setClassName(className);
		stuList=new ArrayList<Student>();
	}
	/*public Banji(String className){
		this.setClassName(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<Student> getStuList() {
		return stuList;
	}

	public void setStuList(List<Student> stuList) {
		this.stuList = stuList;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((classId == null) ? 0 : classId.hashCode());
		result = prime * result + ((className == null) ? 0 : className.hashCode());
		result = prime * result + ((stuList == null) ? 0 : stuList.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if(this==obj){
			return true;
		}
		if(obj.getClass()==Banji.class){
			Banji banji=(Banji)obj;
			return banji.getClassName().equals(className);
		}
		return false;
	}
	/**
	 * 方法一:将学生添加到班级
	 * @param stu  要添加的学生
	 */
	public void addStudent(Student stu){
		boolean flag=false;
		for(Student stu1:stuList){
			if(stu1.equals(stu)){
				flag=true;
				break;
			}
		}
		if(flag){
			System.out.println("该学生已经存在,请不要重复添加。");
		}else{
			stuList.add(stu);
		}
	}
	
	/**
	 * 方法二:通过学号查询学生在班级中是否存在
	 * @param stuNum  要查询的学生的学号
	 * @return  学生的信息
	 */
	public Student searchStudentByNum(String stuNum){
		Student stu=null;
		for(Student stu2:stuList){
			if(stu2.getId().equals(stuNum)){   //判断该学生是否存在
				stu=stu2;
				break;
			}
		}
		return stu;
	}
	
	/**
	 * 方法三:输入班级学生的语文成绩
	 * @param stuNum  要输入语文成绩的学生的学号
	 * @param score   要输入的语文成绩
	 */
	public void insertChineseScore(String stuNum,float score){
		for(Student stu3:stuList){
			if(stu3.getId().equals(stuNum)){
				stu3.setChinese(score);
				break;
			}else{
				System.out.println("亲,没有该学生的信息哟。");break;
			}
		}
	}
	/**
	 * 方法四:输入班级学生的数学成绩
	 * @param stuNum  要输入数学成绩的学生的学号
	 * @param score   要输入的数学成绩
	 */
	public void insertMath(String stuNum,float score){
		for(Student stu4:stuList){
			if(stu4.getId().equals(stuNum)){
				stu4.setMath(score);
				break;
			}else{
				System.out.println("亲,没有该学生的信息哟。");break;
			}
		}
	}
	
	/**
	 * 方法五:删除学生信息
	 * @param stuNum  要删除的学生的学号
	 */
	public void deleteStudent(String stuNum){
		for(Student stu5:stuList){
			if(stu5.getId().equals(stuNum)){
				stuList.remove(stu5);
				break;
			}else{
				System.out.println("亲,没有该学生的信息哟。");
				break;
			}
		}
	}
	
	/**
	 * 方法六:显示所有学生的信息
	 */
	public void displayAllStudent(){
		for(Student stu6:stuList){
			System.out.println(stu6);
		}
	}
}

学生类
public class Student {
	// 属性:学号,姓名,数学成绩,语文成绩
	private String id;
	private String name;
	private float math;
	private float chinese;

	// 无参构造方法
	public Student() {

	}

	// 带参构造方法
	public Student(String id, String name) {
		this.setId(id);
		this.setName(name);
	}
 
	public Student(float math,float chinese){
		this.setMath(math);
		this.setChinese(chinese);
	}
	public Student(float chinese){
		this.setMath(chinese);
	}
	// 封装
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

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

	// 重写HashCode方法
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + Float.floatToIntBits(chinese);
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + Float.floatToIntBits(math);
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	// 重写equals方法
	@Override
	public boolean equals(Object obj) {
		// 先判断对象是否相等,相等则返回true
		if (this == obj) {
			return true;
		}
		// 判断是否是同一个类
		if (obj.getClass() == Student.class) {
			Student student = (Student) obj; // 强制类型转换
			return student.getId().equals(id) & student.getName().equals(name);
		}
		return false;
	}
	
    //重写toString方法
	@Override
	public String toString() {
		return "学生信息[学号:" + id + ", 姓名:" + name + "]";
	}
	
	
	

}

http://img1.sycdn.imooc.com//climg/5c9dd2c00001af1713040510.jpg



正在回答

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

7回答

同学你好,这两个问题是由于普通班级与主学生列表的班级共用了一个对象,修改代码如下图所示:http://img1.sycdn.imooc.com//climg/5ca341650001219907480513.jpghttp://img1.sycdn.imooc.com//climg/5ca33f810001cce307300603.jpg

建议同学作业不要在问答区问,直接上传作业,老师会有一个详细的批复文档,帮助同学更高效的解决问题。老师如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 士林健津_007 提问者 #1
    感谢老师的耐心回答。根据老师的方法,问题得到了解决。
    2019-04-03 14:47:42
提问者 士林健津_007 2019-04-02 18:14:29
测试类:
public class TestDemo {
	Scanner stdIn=new Scanner(System.in);
	//方法一:主菜单
    public void mainMenu(){
    	System.out.println("***********************************");
    	System.out.println("          **主菜单**");
    	System.out.println("          1--班级管理");
    	System.out.println("          2--学校管理");
    	System.out.println("          0--退出");
    	System.out.println("***********************************");
    }
    
    //方法二:班级管理菜单
    public void banjiMenu(){
    	System.out.println("********************************************");
    	System.out.println("              **班级管理**");
    	System.out.println("              1--添加学生信息到主学生列表");
    	System.out.println("              2--添加学生信息到普通班级");
    	System.out.println("              3--通过学号查询学生信息");
    	System.out.println("              4--输入班级的语文成绩");
    	System.out.println("              5--输入班级的数学成绩");
    	System.out.println("              6--删除学生信息");
    	System.out.println("              7--显示所有学生信息");
    	System.out.println("              9--返回上一级菜单");
    	System.out.println("********************************************");
    }
    
    //方法三:学校管理菜单
    public void schoolMenu(){
    	System.out.println("***********************************");
    	System.out.println("           1--创建班级");
    	System.out.println("           2--删除班级");
    	System.out.println("           3--通过班级名称查询班级信息");
    	System.out.println("           4--对各班语文成绩按平均分进行由大到小排序");
    	System.out.println("           5--对各班数学成绩按平均分进行由大到小排序");
    	System.out.println("           6--显示所有班级名称");
    	System.out.println("           9--返回上一级菜单");
    	System.out.println("***********************************");
    }
    
    //方法四:班级的测试方法
    public void testBanji(Banji banji,Student student,School school){
    	TestDemo td=new TestDemo();
    	Outer:
    	while(true){
    	td.banjiMenu();
    	System.out.println("请输入对应的数字对班级进行管理:");
    	Inner:
    		while(true){
    	int w=stdIn.nextInt();
    	if(w==9){
    		td.test(banji,student,school,td);
    		break Outer;
    	}
    	switch(w){
    	case 1:System.out.println("添加学生信息到主学生列表");
    	       System.out.println("请输入要添加的学生的数量:");
    	       int e=stdIn.nextInt();
    	       for(int i=1;i<=e;i++){
    	    	   System.out.println("请输入第"+i+"个学生信息:");
    	    	   System.out.println("请输入学号:");
    	    	   String id=stdIn.next();
    	    	   System.out.println("请输入学生姓名:");
    	    	   String name=stdIn.next();
    	    	   Student stu=new Student(id,name);
    	    	   banji.addStudent(stu);
    	       }
    	       System.out.println("主学生列表的学生信息如下:");
    	       banji.displayAllStudent();
    	       break Inner;
    	case 2:System.out.println("添加学生信息到普通班级");
    	       System.out.println("从主学生列表获取学生分配班级");
    	       System.out.println("请输入要将学生分配到的班级名称:");
    	       String banjiName=stdIn.next();
    	       Banji banji2=school.searchByName(banjiName);
    	       if(banji2==null){
    	    	   System.out.println("亲,该班级不存在哟,赶快去添加吧。");break Inner;
    	       }else{
    	    	   System.out.println("请输入要添加的学生的数量:");
        	       int y=stdIn.nextInt();
        	       for(int i=1;i<=y;i++){
        	    	   System.out.println("请输入第"+i+"个学生信息:");
        	    	   System.out.println("请输入学号:");
        	    	   String id=stdIn.next();
        	    	   //通过学生ID查询主学生列表中是否存在该ID的学生
        	    	   Student stu2=banji.searchStudentByNum(id);
        	    	   if(stu2==null){
        	    		   System.out.println("该学生在主学生列表中不存在,赶快去添加吧。");break Inner;
        	    	   }else{
        	    		   banji2.addStudent(stu2);
        	    		   System.out.println("添加完成。");
        	    	   }
        	    	   
        	       }
    	       }
    	       break Inner;
    	case 3:System.out.println("通过学号查询学生信息");
    	       System.out.println("请输入要查询的学生所在的班级名称:");
    	       String str3=stdIn.next();
    	       Banji banji3=school.searchByName(str3);
    	       if(banji3==null){
    	    	   System.out.println("亲,该班级不存在哟。");break Inner;
    	       }else{
    	    	   System.out.println("请输入要查询的学生的学号:");
    	    	   String str31=stdIn.next();
    	    	   Student stu3=banji3.searchStudentByNum(str31);
    	    	   if(stu3==null){
    	    		   System.out.println("亲,该学生不存在哟。");break Inner;
    	    	   }else{
    	    		   banji3.deleteStudent(str31);
    	    	   }
    	       }
    	       break Inner;
    	case 4:System.out.println("输入班级的语文成绩");   break Inner;
    	case 5:System.out.println("输入班级的数学成绩");   break Inner;
    	case 6:System.out.println("删除学生信息");      break Inner;
    	case 7:System.out.println("显示所有学生信息");  break Inner;
    	default:System.out.println("您的输入超出范围,请重新输入:");  continue Inner;
    	  }
    	 }
    	}
    }
    
    //方法五:学校的测试方法
    public void testSchool(Banji banji,Student student,School school){
    	TestDemo td=new TestDemo();
    	int t=0;
    	Outer:
    	while(true){
    	td.schoolMenu();
    	System.out.println("请输入对应的数字对学校进行管理:");
    	Inner:
    		while(true){
    	t=stdIn.nextInt();
    	if(t==9){
    		td.test(banji,student,school,td);
    		break Outer;
    	 }
    	switch(t){
    	case 1:System.out.println("创建班级");
    	       System.out.println("请输入要创建的班级id:");
    	       String banjiId=stdIn.next();
    	       System.out.println("请输入要创建的班级名称:");
    	       String banjiName=stdIn.next();
    	       banji=new Banji(banjiId,banjiName);
    	       school.addBanji(banji);
    	       break Inner;
    	case 2:System.out.println("删除班级");
    	       System.out.println("请输入要删除的班级名称:");
    	       String str2=stdIn.next();
    	       if(str2.equals("主学生列表")){
    	    	   System.out.println("主学生列表不能删除哟。");break;
    	       }else{
    	       Banji banji2=school.searchByName(str2);
    	       if(banji2==null){
    	    	   System.out.println("亲,该班级不存在哟。");
    	       }else{
    	    	   school.deleteBanji(banji2);
    	       }
    	       }
    	       break Inner;
    	case 3:System.out.println("通过班级名称查询班级信息");   break Inner;
    	case 4:System.out.println("对各班语文成绩按平均分进行由大到小排序");  break Inner;
    	case 5:System.out.println("对各班数学成绩按平均分进行由大到小排序");  break Inner;
    	case 6:System.out.println("显示所有班级名称");
    	       school.displayBanjiName();
    	       break Inner;
    	default:System.out.println("您的输入超出范围,请重新输入:");   continue Inner;
    	}
       }
    }
    }
    
    //方法六:主流程
    public void test(Banji banji,Student student,School school,TestDemo td){
    	int q=0;
    	Outer:
    	while(true){
    	td.mainMenu();
    	System.out.println("请输入对应数字进行操作:");
    	Inner:
    	while(true){
    	q=stdIn.nextInt();
    	if(q==0){
    		break Outer;
    	}
    	switch(q){
    	case 1:td.testBanji(banji,student,school);break Outer;
    	case 2:td.testSchool(banji,student,school);break Outer;
    	default:System.out.println("您的输入超出范围,请重新输入:");continue Inner;
    	 }
    	 }
    	}
    	
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestDemo td=new TestDemo();
		/**
		 * 主学生列表
		 */
    	Banji banji=new Banji("b001","主学生列表");
    	Student student=new Student();
    	School school=new School();
    	school.addBanji(banji);
		td.test(banji,student,school,td);

	}

}

这是根据老师的方法修改后的代码


吃吃吃鱼的猫 2019-04-01 15:10:50

同学你好,修改代码如下:http://img1.sycdn.imooc.com//climg/5ca1b96d0001c82208240702.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 士林健津_007 #1
    老师你好,我依据老师的方法,把代码修改了。但是还是出现问题,有两种情况:一种是:我先往主学生列表中添加学生,然后再创建班级,然后再往班级里面添加主学生列表中存在的学生,但是它居然显示说“主学生列表中”没有该学生。第二种情况:我先创建班级,然后再往“主学生列表”中添加学生,之后再往创建的班级里面添加学生,但是它显示“该学生已经存在,请不要重复添加。”按程序执行的顺序就是,在Banji类的addStudent方法中,stuList此时指的是“主学生列表”,而不是创建的班级。我请问老师这该怎么解决,我查看了我的代码好多次,我都不知道哪里出问题了。请老师明示。谢谢老师。我修改后的代码已经新贴出来了。
    2019-04-02 18:29:48
提问者 士林健津_007 2019-03-31 13:19:15
班级类:
public class Banji {
     //班级编号   班级名称  存放学生的集合
	private String classId;
	private String className;
	private List<Student> stuList;
	private List<Student> stuList1;
	
	//带参构造方法
	public Banji(String classId,String className){
		this.setClassId(classId);
		this.setClassName(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<Student> getStuList() {
		return stuList;
	}

	public void setStuList(List<Student> stuList) {
		this.stuList = stuList;
	}
	
	public List<Student> getStuList1() {
		return stuList1;
	}
	public void setStuList1(List<Student> stuList1) {
		this.stuList1 = stuList1;
	}
	/**
	 * 方法一:将学生添加到班级
	 * @param stu  要添加的学生
	 */
	public void addStudent(Student stu){
		boolean flag=false;
		for(Student stu1:stuList){
			if(stu1.equals(stu)){
				flag=true;
				break;
			}
		}
		if(flag){
			System.out.println("该学生已经存在,请不要重复添加。");
		}else{
			stuList.add(stu);
		}
	}
	
	/**
	 * 方法二:通过学号查询学生在班级中是否存在
	 * @param stuNum  要查询的学生的学号
	 * @return  学生的信息
	 */
	public Student searchStudentByNum(String stuNum){
		Student stu=null;
		for(Student stu2:stuList){
			if(stu2.getId().equals(stuNum)){   //判断该学生是否存在
				stu=stu2;
				break;
			}
		}
		return stu;
	}
	
	/**
	 * 方法三:输入班级学生的语文成绩
	 * @param stuNum  要输入语文成绩的学生的学号
	 * @param score   要输入的语文成绩
	 */
	public void insertChineseScore(String stuNum,float score){
		for(Student stu3:stuList){
			if(stu3.getId().equals(stuNum)){
				stu3.setChinese(score);
				break;
			}else{
				System.out.println("亲,没有该学生的信息哟。");break;
			}
		}
	}
	/**
	 * 方法四:输入班级学生的数学成绩
	 * @param stuNum  要输入数学成绩的学生的学号
	 * @param score   要输入的数学成绩
	 */
	public void insertMath(String stuNum,float score){
		for(Student stu4:stuList){
			if(stu4.getId().equals(stuNum)){
				stu4.setMath(score);
				break;
			}else{
				System.out.println("亲,没有该学生的信息哟。");break;
			}
		}
	}
	
	/**
	 * 方法五:删除学生信息
	 * @param stuNum  要删除的学生的学号
	 */
	public void deleteStudent(String stuNum){
		for(Student stu5:stuList){
			if(stu5.getId().equals(stuNum)){
				stuList.remove(stu5);
				break;
			}else{
				System.out.println("亲,没有该学生的信息哟。");
				break;
			}
		}
	}
	
	/**
	 * 方法六:显示所有学生的信息
	 */
	public void displayAllStudent(){
		for(Student stu6:stuList){
			System.out.println(stu6);
		}
	}
}
学生类:
public class Student {
	// 属性:学号,姓名,数学成绩,语文成绩
	private String id;
	private String name;
	private float math;
	private float chinese;

	// 无参构造方法
	public Student() {

	}

	// 带参构造方法
	public Student(String id, String name) {
		this.setId(id);
		this.setName(name);
	}
 
	public Student(float math,float chinese){
		this.setMath(math);
		this.setChinese(chinese);
	}
	public Student(float chinese){
		this.setMath(chinese);
	}
	// 封装
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

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

	// 重写HashCode方法
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + Float.floatToIntBits(chinese);
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + Float.floatToIntBits(math);
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	// 重写equals方法
	@Override
	public boolean equals(Object obj) {
		// 先判断对象是否相等,相等则返回true
		if (this == obj) {
			return true;
		}
		// 判断是否是同一个类
		if (obj.getClass() == Student.class) {
			Student student = (Student) obj; // 强制类型转换
			return student.getId().equals(id) & student.getName().equals(name) & student.getChinese()==(chinese) & student.getMath()==(math);
		}
		return false;
	}
	
    //重写toString方法
	@Override
	public String toString() {
		return "学生信息[学号:" + id + ", 姓名:" + name + "]";
	}
}


提问者 士林健津_007 2019-03-31 13:13:37
学校类
public class School {
    private Map<String,Banji> schoolMap; //存放班级的集合   班级名称作为key值,班级信息作为value值
    
    //构造方法
    public School(){
    	schoolMap=new HashMap<String,Banji>();
    }
    
    //封装
	public Map<String, Banji> getSchoolMap() {
		return schoolMap;
	}

	public void setSchoolMap(Map<String, Banji> schoolMap) {
		this.schoolMap = schoolMap;
	}
    
	/**
	 * 方法一:添加班级
	 * @param banji  要添加的班级
	 */
	public void addBanji(Banji banji){
		//班级名称作为key值
		schoolMap.put(banji.getClassName(), banji);
	}
	
	/**
	 * 方法二:删除班级
	 * @param banji  要删除的班级
	 */
	public void deleteBanji(Banji banji){
		schoolMap.remove(banji.getClassName());
		System.out.println("删除成功。");
	}
	
	/**
	 * 方法三:通过班级名称查询班级 
	 * @param className  要查询的班级的名称
	 * @return    被查询的班级信息
	 */
	public Banji searchByName(String className){
		Banji banji=null;
		int n=schoolMap.size();
		System.out.println(n);
		Set<String> banjiSet=schoolMap.keySet();
		     for(String banji3:banjiSet){
		    	 if(banji3.equals(className)){
		    		 banji=schoolMap.get(banji3);
		    		 break;
		    	 }
		     }
		     return banji;
	}
	
	/**
	 * 方法四:对各班语文成绩按平均分进行由大到小排序
	 */
	public void sortChineseByAverage(){
		//使用Map集合存放班级语文成绩平均分,班级名称作为key值,平均分作为value值
		Map<String,Float> banjiMap=new HashMap<String,Float>();
		Banji banji=null;
		Set<String> banjiName=schoolMap.keySet();   //获取班级名称的集合
		for(String s:banjiName){                  //使用增强型for循环遍历班级名称集合
			banji=this.searchByName(s);        //确认班级是否存在
			if(banji==null){
				System.out.println("该班级不存在。");break;
			}else{
				float chinese1=0.0f;
				int m=0;
			//System.out.println(s+"的平均分:");    //某班
			List<Student> ls=banji.getStuList();       //获取班级类中存放学生的集合
			Iterator <Student> stu=ls.iterator();      //使用迭代器循环遍历学生
			   while(stu.hasNext()){                    //使用while循环遍历学生的语文成绩
				   chinese1+=stu.next().getChinese();
				   m++;
			   }
			   chinese1=chinese1/m;
			   banjiMap.put(s, chinese1);  
			}
		}
		List<Map.Entry<String,Float>> lm=new ArrayList<Map.Entry<String,Float>>(banjiMap.entrySet());
		Collections.sort(lm, new Comparator<Map.Entry<String,Float>>(){
			//降序排序
			public int compare(Entry<String,Float> o1,Entry<String,Float> o2){
				return o2.getValue().compareTo(o1.getValue());
			}
		});
		    for(Map.Entry<String, Float> mes:lm){
		    	System.out.println(mes.getKey()+"的平均分:"+mes.getValue());
		    }
			}
	/**
	 * 方法六:显示所有班级名称
	 */
	public void displayBanjiName(){
		Set<String> banjiName=schoolMap.keySet();
		for(String s:banjiName){
			System.out.println(s);
		}
	}
	}
	
测试类:
public class TestDemo {
	Scanner stdIn=new Scanner(System.in);
	School school=new School();
	//方法一:主菜单
    public void mainMenu(){
    	System.out.println("***********************************");
    	System.out.println("          **主菜单**");
    	System.out.println("          1--班级管理");
    	System.out.println("          2--学校管理");
    	System.out.println("          0--退出");
    	System.out.println("***********************************");
    }
    
    //方法二:班级管理菜单
    public void banjiMenu(){
    	System.out.println("********************************************");
    	System.out.println("              **班级管理**");
    	System.out.println("              1--添加学生信息到主学生列表");
    	System.out.println("              2--添加学生信息到普通班级");
    	System.out.println("              3--通过学号查询学生信息");
    	System.out.println("              4--输入班级的语文成绩");
    	System.out.println("              5--输入班级的数学成绩");
    	System.out.println("              6--删除学生信息");
    	System.out.println("              7--显示所有学生信息");
    	System.out.println("              9--返回上一级菜单");
    	System.out.println("********************************************");
    }
    
    //方法三:学校管理菜单
    public void schoolMenu(){
    	System.out.println("***********************************");
    	System.out.println("           1--创建班级");
    	System.out.println("           2--删除班级");
    	System.out.println("           3--通过班级名称查询班级信息");
    	System.out.println("           4--对各班语文成绩按平均分进行由大到小排序");
    	System.out.println("           5--对各班数学成绩按平均分进行由大到小排序");
    	System.out.println("           6--显示所有班级名称");
    	System.out.println("           9--返回上一级菜单");
    	System.out.println("***********************************");
    }
    
    //方法四:班级的测试方法
    public void testBanji(Banji banji,Student student,School school){
    	TestDemo td=new TestDemo();
    	Outer:
    	while(true){
    	td.banjiMenu();
    	System.out.println("请输入对应的数字对班级进行管理:");
    	Inner:
    		while(true){
    	int w=stdIn.nextInt();
    	if(w==9){
    		td.test();
    		break Outer;
    	}
    	switch(w){
    	case 1:System.out.println("添加学生信息到主学生列表");
    	       System.out.println("请输入要添加的学生的数量:");
    	       int e=stdIn.nextInt();
    	       for(int i=1;i<=e;i++){
    	    	   System.out.println("请输入第"+i+"个学生信息:");
    	    	   System.out.println("请输入学号:");
    	    	   String id=stdIn.next();
    	    	   System.out.println("请输入学生姓名:");
    	    	   String name=stdIn.next();
    	    	   Student stu=new Student(id,name);
    	    	   banji.addStudent(stu);
    	       }
    	       System.out.println("主学生列表的学生信息如下:");
    	       banji.displayAllStudent();
    	       break Inner;
    	case 2:System.out.println("添加学生信息到普通班级");
    	       System.out.println("从主学生列表获取学生分配班级");
    	       System.out.println("请输入要将学生分配到的班级名称:");
    	       String banjiName=stdIn.next();
    	       Banji banji2=school.searchByName(banjiName);
    	       if(banji2==null){
    	    	   System.out.println("亲,该班级不存在哟,赶快去添加吧。");break Inner;
    	       }else{
    	    	   System.out.println("请输入要添加的学生的数量:");
        	       int y=stdIn.nextInt();
        	       for(int i=1;i<=y;i++){
        	    	   System.out.println("请输入第"+i+"个学生信息:");
        	    	   System.out.println("请输入学号:");
        	    	   String id=stdIn.next();
        	    	   //通过学生ID查询主学生列表中是否存在该ID的学生
        	    	   Student stu2=banji.searchStudentByNum(id);
        	    	   if(stu2==null){
        	    		   System.out.println("该学生在主学生列表中不存在,赶快去添加吧。");break Inner;
        	    	   }else{
        	    		   banji2.addStudent(stu2);
        	    		   System.out.println("添加完成。");
        	    	   }
        	    	   
        	       }
    	       }
    	       break Inner;
    	case 3:System.out.println("通过学号查询学生信息");
    	       System.out.println("请输入要查询的学生所在的班级名称:");
    	       String str3=stdIn.next();
    	       Banji banji3=school.searchByName(str3);
    	       if(banji3==null){
    	    	   System.out.println("亲,该班级不存在哟。");break;
    	       }else{
    	    	   System.out.println("请输入要查询的学生的学号:");
    	    	   String str31=stdIn.next();
    	    	   Student stu3=banji3.searchStudentByNum(str31);
    	    	   if(stu3==null){
    	    		   System.out.println("亲,该学生不存在哟。");break;
    	    	   }else{
    	    		   banji3.deleteStudent(str31);
    	    	   }
    	       }
    	       break Inner;
    	case 4:System.out.println("输入班级的语文成绩");   break Inner;
    	case 5:System.out.println("输入班级的数学成绩");   break Inner;
    	case 6:System.out.println("删除学生信息");      break Inner;
    	case 7:System.out.println("显示所有学生信息");  break Inner;
    	default:System.out.println("您的输入超出范围,请重新输入:");  continue Inner;
    	  }
    	 }
    	}
    }
    
    //方法五:学校的测试方法
    public void testSchool(Banji banji,Student student,School school){
    	TestDemo td=new TestDemo();
    	int t=0;
    	Outer:
    	while(true){
    	td.schoolMenu();
    	System.out.println("请输入对应的数字对学校进行管理:");
    	Inner:
    		while(true){
    	t=stdIn.nextInt();
    	if(t==9){
    		td.test();
    		break Outer;
    	 }
    	switch(t){
    	case 1:System.out.println("创建班级");
    	       System.out.println("请输入要创建的班级id:");
    	       String banjiId=stdIn.next();
    	       System.out.println("请输入要创建的班级名称:");
    	       String banjiName=stdIn.next();
    	       banji=new Banji(banjiId,banjiName);
    	       school.addBanji(banji);
    	       break Inner;
    	case 2:System.out.println("删除班级");
    	       System.out.println("请输入要删除的班级名称:");
    	       String str2=stdIn.next();
    	       if(str2.equals("主学生列表")){
    	    	   System.out.println("主学生列表不能删除哟。");break;
    	       }else{
    	       Banji banji2=school.searchByName(str2);
    	       if(banji2==null){
    	    	   System.out.println("亲,该班级不存在哟。");
    	       }else{
    	    	   school.deleteBanji(banji2);
    	       }
    	       }
    	       break Inner;
    	case 3:System.out.println("通过班级名称查询班级信息");   break Inner;
    	case 4:System.out.println("对各班语文成绩按平均分进行由大到小排序");  break Inner;
    	case 5:System.out.println("对各班数学成绩按平均分进行由大到小排序");  break Inner;
    	case 6:System.out.println("显示所有班级名称");
    	       school.displayBanjiName();
    	       break Inner;
    	default:System.out.println("您的输入超出范围,请重新输入:");   continue Inner;
    	}
       }
    }
    }
    
    //方法六:主流程
    public void test(){
    	TestDemo td=new TestDemo();
    	Banji banji=new Banji("b001","主学生列表");
    	Student student=new Student();
    	School school=new School();
    	school.addBanji(banji);
    	int q=0;
    	Outer:
    	while(true){
    	td.mainMenu();
    	System.out.println("请输入对应数字进行操作:");
    	Inner:
    	while(true){
    	q=stdIn.nextInt();
    	if(q==0){
    		break Outer;
    	}
    	switch(q){
    	case 1:td.testBanji(banji,student,school);break Outer;
    	case 2:td.testSchool(banji,student,school);break Outer;
    	default:System.out.println("您的输入超出范围,请重新输入:");continue Inner;
    	 }
    	 }
    	}
    	
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestDemo td=new TestDemo();
		td.test();

	}

}

目前就是这样,请指点一下。



  • 提问者 士林健津_007 #1
    其他的还是和以前一样
    2019-03-31 13:14:39
吃吃吃鱼的猫 2019-03-29 19:36:26

同学你好,方法中定义的变量是局部变量,出了方法不再有效。所以在testSchool()方法中创建的班级虽然添加进班级集合schoolMap里面,但在testBanji()方法中不能获取。还有,在显示所有班级名称时,两个方法中学校对象不再是同一个对象,所以“主学生列表”无法显示。同学可以根据以下思路修改:在test方法中定义Banji,Student,School对象,并且做为testBanji(),testSchool()方法中的参数,在方法中只使用这三个对象进行操作。

http://img1.sycdn.imooc.com//climg/5c9e0117000142ec07170462.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 士林健津_007 #1
    老师好,我按照老师思路写代码。但还是出现了schoolMap中只有一个元素的问题,导致出现:该班级不存在 的提示。但在显示所有班级名称时,又能显示我创建的“一班”和程序运行产生“主学生列表”名称。
    2019-03-30 11:06:39
  • 好帮手慕雪 回复 提问者 士林健津_007 #2
    请同学再次贴一下代码哦。
    2019-03-31 10:58:57
  • 提问者 士林健津_007 回复 好帮手慕雪 #3
    代码重贴了,麻烦帮我看看哪里不对,谢谢。
    2019-03-31 13:20:28
吃吃吃鱼的猫 2019-03-29 17:43:11

同学你好,不进入的原因是banji3和className名称不一致,老师运行你的代码,发现初始班级名称只有“主学生列表”,所以选择“请输入要将学生添加到的班级名称”时,输入班级名称为“主学生列表”,就有1515输出了。如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 士林健津_007 #1
    老师好,我不理解为什么我新创建的班级不能添加进去班级集合schoolMap里面,还有,在显示所有班级名称时,为什么“主学生列表”没有显示。
    2019-03-29 18:54:00
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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