热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

scala统计学生成绩

scala统计学生成绩学生的成绩清单格式如下所示,第一行为表头,各字段意思分别为学号、性别、课程名1、课程名2等,后面每一行代表一个学生的信息,各字段之间用空白符隔开Idgende

scala统计学生成绩

学生的成绩清单格式如下所示,第一行为表头,各字段意思分别为学号、性别、课程名

1、课程名 2 等,后面每一行代表一个学生的信息,各字段之间用空白符隔开

Id

gender Math English Physics

301610 male 80 64 78

301611 female 65 87 58

...

给定任何一个如上格式的清单(不同清单里课程数量可能不一样),要求尽可能采用函

数式编程,统计出各门课程的平均成绩,最低成绩,和最高成绩;另外还需按男女同学分开,

分别统计各门课程的平均成绩,最低成绩,和最高成绩。

测试样例 1 如下:

Id gender Math English Physics

301610 male 80 64 78

301611 female 65 87 58

301612 female 44 71 77

301613 female 66 71 91

301614 female 70 71 100

301615 male 72 77 72

301616 female 73 81 75

301617 female 69 77 75

301618 male 73 61 65

301619 male 74 69 68

301620 male 76 62 76

301621 male 73 69 91

301622 male 55 69 61

301623 male 50 58 75

301624 female 63 83 93

301625 male 72 54 100

301626 male 76 66 73

301627 male 82 87 79

301628 female 62 80 54

301629 male 89 77 72

样例 1 的统计结果输出为:

course average min max

Math: 69.20 44.00 89.00

English: 71.70 54.00 87.00

Physics: 76.65 54.00 100.00

course average min max (males)

Math: 72.67 50.00 89.00

English: 67.75 54.00 87.00

Physics: 75.83 61.00 100.00

course average min max (females)

Math: 64.00 44.00 73.00

English: 77.63 71.00 87.00

Physics: 77.88 54.00 100.00

测试样例 2

Id gender Math English Physics Science

301610 male 72 39 74 93

301611 male 75 85 93 26

301612 female 85 79 91 57

301613 female 63 89 61 62

301614 male 72 63 58 64

301615 male 99 82 70 31

301616 female 100 81 63 72

301617 male 74 100 81 59

301618 female 68 72 63 100

301619 male 63 39 59 87

301620 female 84 88 48 48

301621 male 71 88 92 46

301622 male 82 49 66 78

301623 male 63 80 83 88

301624 female 86 80 56 69

301625 male 76 69 86 49

301626 male 91 59 93 51

301627 female 92 76 79 100

301628 male 79 89 78 57

301629 male 85 74 78 80

样例 2 的统计结果为:

course average min max

Math: 79.00 63.00 100.00

English: 74.05 39.00 100.00

Physics: 73.60 48.00 93.00

Science: 65.85 26.00 100.00

course average min max

Math: 77.08 63.00 99.00

English: 70.46 39.00 100.00

Physics: 77.77 58.00 93.00

Science: 62.23 26.00 93.00

course average min max

Math: 82.57 63.00 100.00

English: 80.71 72.00 89.00

Physics: 65.86 48.00 91.00

Science: 72.57 48.00 100.00

 

 1 package com
 2 
 3 object test{
 4   def main(arg:Array[String]){
 5     // 假设数据文件在当前目录下
 6     val inputFile = scala.io.Source.fromFile("C:\\Users\\hasee\\Desktop\\spark2-3-2.txt")
 7     //”\\s+“是字符串正则表达式,将每行按空白字符(包括空格/制表符)分开
 8     // 由于可能涉及多次遍历,用 toList 将 Iterator 装为 List
 9     // originalData 的类型为 List[Array[String]]
10     val originalData = inputFile.getLines.map{_.split("\\s+")}.toList
11     val courseNames = originalData.head.drop(2)//获取第一行中的课程名
12     val allStudents = originalData.tail // 去除第一行剩下的数据
13     val courseNum = courseNames.length
14     // 统计函数,参数为需要常用统计的行
15     //用到了外部变量 courseNum,属于闭包函数
16     def statistic(lines:List[Array[String]]) = {
17       // for 推导式,对每门课程生成一个三元组,分别表示总分,最低分和最高分
18       (for(i<-2 to courseNum+1) yield{
19         val temp = lines map {
20           elem=>elem(i).toDouble
21         }
22         (temp.sum,temp.min,temp.max)
23       })map{case (total,min,max)=>(total/lines.length,min,max)}
24       // 最后一个 map 对 for 的结果进行修改,将总分转为平均分
25     }
26     // 输出结果函数
27     def printResult(theresult:Seq[(Double,Double,Double)])
28     {
29       // 遍历前调用 zip 方法将课程名容器和结果容器合并,合并结果为二元组容器
30       (courseNames zip theresult) foreach
31         {
32           case (course,result) =>println(f"${course+":"}%-10s${result._1}%5.2f${result._2}%8.2f${result._3}%8.2f")
33         }
34     }
35     // 分别调用两个函数统计全体学生并输出结果
36     val allResult = statistic(allStudents)
37     println("course   average  min  max")
38     printResult(allResult)
39     //按性别划分为两个容器
40     val (maleLines,femaleLines) = allStudents partition{_(1)=="male"}
41 
42 
43 
44     // 分别调用两个函数统计男学生并输出结果
45     val maleResult =statistic(maleLines)
46     println("course   average   min   max")
47     printResult(maleResult)
48     // 分别调用两个函数统计女学生并输出结果
49     val femaleResult =statistic(femaleLines)
50     println("course   average   min   max")
51     printResult(femaleResult)
52 
53   }
54 
55 }

 运行结果:

scala统计学生成绩

 


推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
author-avatar
awdewqd65_988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有