戴夫·托马斯(Dave Thomas)的数据处理卡塔(Kata)的快速解决方案(3)
戴夫·托马斯(Dave Thomas)的数据处理卡塔(Kata)的快速解决方案(3)
在第3部分中,要求我们从第1部分和第2部分中干燥(不要重复自己)代码。我的完整解决方案可以在这里找到。
拿起先前编写的两个程序,并尽可能多地分解出通用代码,剩下两个较小的程序和某种共享功能。
第1部分和第2部分中的分配非常相似。 每一项都要求我们加载文件,将文件的文本提取到表中,清理每一行,选择我们感兴趣的列,然后查找并打印两列之间的差异最小的行名。
我将Dave的说明解释为“留给您两个小程序”,意味着我应该创建我的“ Executor”结构的两个版本,一个用于天气,另一个用于足球数据。 在一个实际的项目中,我将合并为一个结构,该结构接受闭包作为两种数据类型之间不同的每种方法的参数。
考虑到我略微潮湿的“法律法规”方法,有两种方法需要重构。
removeUnneededColumns()
由于每个文件都有我们需要使用的不同列,因此不再可以对其进行硬编码。 我的方法是包括一个validColumnIndexes:[Int]参数。 然后,我们遍历每个索引并返回该行中单元格的映射。
静态函数removeUnneededColumns(fromTable表:[[String]],validColumnIndexes:[Int])-> [[String]] {
返回table.map {(行:[String])在
返回takeNeededColumns(行:行,有效列索引:有效列索引)
}
}
私有静态函数takeNeededColumns(行:[String],validColumnIndexes:[Int])-> [String] {
返回validColumnIndexes.map {row [$ 0]}
}
。评估()
我们的评估方法也需要更改,因为在接受特定类型的数组之前。 为了解决这个问题,我创建了WeatherRecord和FootballResult都符合的DifferenceCalculatable协议。
协议差异可计算{
var名称:字符串{get}
var差异:Double {get}
}
这样一来,我们就可以创建一个通用的评估方法,该方法的类型必须限制在DifferenceCalculatable中,从而可以访问.difference和.name,
静态函数评价(项:[元素])->字符串? {
令lettDelta = items.minElement {$ 0.difference <$ 1.difference}
警卫队让名字= minimumDelta?.name其他{返回nil}
返回“ \(名称)”
}
符合DifferenceCalculatable意味着我必须将WeatherRecord的let dayOfMonthIndex:Int更改为name:String及其相应的init方法。