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

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

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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
这是测试类
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

1
<br>


正在回答

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

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
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
测试类:
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
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
班级类:
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
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
学校类
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();
 
    }
 
}

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

1
<br>


  • 提问者 士林健津_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下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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