戴夫·托马斯(Dave Thomas)的数据整理卡塔(Kata)的快速解决方案,第2部分

戴夫·托马斯(Dave Thomas)的数据整理卡塔(Kata)的快速解决方案,第2部分

如果您还没有阅读我对Dave数据处理kata的第1部分的解决方案,请首先进行检查。 第2部分要求我们清理分析英超联赛足球(您知道,足球)结果的数据集。

文件football.dat包含2001/2英超联赛​​的结果。 标记为“ F”和“ A”的列包含该赛季每个球队得分和对阵球队的进球总数(因此,阿森纳对阵对手的进球为79球,对阵对手的进球为36)。 编写一个程序,以在“达成”和“反对”目标中差异最小的团队的名字打印出来。

此练习与第1部分非常相似,并且可以重复使用许多原始代码。 这篇文章将重点讨论第1部分和第2部分之间的区别。[GitHub上的完整代码]。

模型

我们需要的是FootballResult模型,而不是WeatherRecord。 在计算/反对增量变量的目标时,我们需要它们的差的绝对值。 这是因为使用WeatherRecord时,最高温度始终高于最低温度,但在这种情况下,任一变量都可以更高。

在将充满字符串的表转换为模型对象时,我还采用了另一种方法。 对于天气记录,可以将所有三个值建模为整数(月日索引,maxTemp,minTemp)。 在本练习中,我们需要一个teamName:String,GoalScoredFor:Int和GoalScoredAgainst:Int。

我选择为我的结构编写一个自定义init,该结构接受三个字符串并将目标字符串转换为Ints。 原因是模型负责将值转换为特定类型。 执行者不应该承担这项责任。

数据变压器

第一个区别是足球数据都不是“脏”的,因此我们可以删除cleanData步骤。 其次,如“模型”部分所述,我们在FootballResult上有一个自定义的init方法,因此我们不需要.convertStringsToInts()方法。

在“天气”数据集中,我们只需要获取前三列,因此我们遍历了所有行,并且对于每行,i .. <3用于获取前三列。 我对此解决方案不满意,因此在这里重新设计以使用flatMap。 #somuchcleaner

 静态函数removeUnneededColumns(fromTable表:[[String]])-> [[String]] { 
 返回table.flatMap {(行:[String])在 
 返回[行[1],行[6],行[8]] 
  }} 

.flatMap()最出名的是将数组数组“展平”,从而使[[“ a”,“ b”],[“ c”,“ d”]展平为[“ a”,“ b”,“ c”,“ d”]。 但是.flatMap()也可以映射并返回一个数组,该数组包含的元素要少于传递给它的元素(.map()不能做到的事情)。 在这种情况下,我们将取出需要保留的列的单元格并返回它们。

*快乐的舞蹈*

然后在适当的时候将名称从天气更改为足球,这就是第1部分和第2部分之间的所有差异。正如Dave所建议的那样,我没有偷看kata的第3部分,但我想我们会做点什么更通用。