对语文成绩排序的方法不能正常排序,老师看一下怎么修改

对语文成绩排序的方法不能正常排序,老师看一下怎么修改

public void sortChineseByAverage() {
		Map<String, Float> score = new HashMap<String, Float>();
		Set<String> classNameSet = schoolMap.keySet();
		if (classNameSet != null) {
			for (String s : classNameSet) {
				if (s.equals("主学生列表"))
					continue;
				float sum = 0.0f;
				BanJi banji = schoolMap.get(s);
				List<Student> stuList = banji.getStuList();
				if (stuList != null) {
					Iterator<Student> it = stuList.iterator();
					while (it.hasNext())
						sum += it.next().getChinese();
					float average = sum / stuList.size();
					score.put(s, average);
				} else
					System.out.println("该班级没有学生!");
			}
		} else
			System.out.println("还未添加班级!");
		List<Entry<String, Float>> list = new ArrayList<Entry<String, Float>>(score.entrySet());
		Collections.sort(list, new Comparator<Entry<String, Float>>() {
			@Override
			public int compare(Entry<String, Float> o1, Entry<String, Float> o2) {
				return new Float(o2.getValue() - o1.getValue()).intValue();
			}
		});
		Iterator<Entry<String, Float>> it = list.iterator();
		while (it.hasNext())
			System.out.println(it.next().getKey() + ":" + it.next().getValue());
	}
	
	public void sortMathByAverage() {
		Map<String, Float> score = new HashMap<String, Float>();
		Set<String> classNameSet = schoolMap.keySet();
		if (classNameSet != null) {
			for (String s : classNameSet) {
				if (s.equals("主学生列表"))
					continue;
				float sum = 0.0f;
				BanJi banji = schoolMap.get(s);
				List<Student> stuList = banji.getStuList();
				if (stuList != null) {
					for (Student stu : stuList)
						sum += stu.getMath();
					Float average = sum / stuList.size();
					score.put(s, average);
				} else
					System.out.println("该班级没有学生!");
			}
		} else
			System.out.println("还未添加班级!");
		List<Entry<String, Float>> list = new ArrayList<Entry<String, Float>>(score.entrySet());
		Collections.sort(list, new Comparator<Entry<String, Float>>() {
			@Override
			public int compare(Entry<String, Float> o1, Entry<String, Float> o2) {
				return o2.getValue().compareTo(o1.getValue());
			}
		});
		for (Entry<String, Float> entry : list)
			System.out.println(entry.getKey() + ":" + entry.getValue());
	}


正在回答

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

2回答

同学你好,这是因为在老师的例子中,循环中只调用了一次it.next()方法,例如如下代码:

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

而同学的代码中一个循环中使用了两次it.next()方法,就可能造成迭代器越界。it.next()就相当于一个指针,每执行一次next(),指针都会下移一次,比如这时第一个it.next()可能指向一个数据,而再调用一次it.next()就会指向下一个数据,而这时如果没有下一个数据,就会抛出异常。同学的代码如下:

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

解决方式:需要将it.next()取出的数据先传给一个新的对象,再通过这个对象进行输出。

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

好帮手慕酷酷 2019-08-16 12:00:07

同学你好,代码的思路很棒!但是有两个小问题:

1、在进行成绩比较的排序时,返回的是整型,不需要new Float类型的对象。

2、迭代器遍历,要先获取指向下一个对象的引用next ,再进行输出。

修改的内容如下:

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

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


  • 提问者 慕慕4125024 #1
    System.out.println("使用迭代器输出所有value:"); Iterator<String> it=animal.values().iterator(); while(it.hasNext()) System.out.print(it.next()+" "); 老师之前的一道例题也是使用it.next()直接输出的,为什么我用it.next().getKey()输出会报错java.util.NoSuchElementException
    2019-08-16 15:15:20
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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