假设我有以下结构:
struct LogInfo {
var logNumber: Int
var species: String
var diameter: Float
var formClass: Int
var numLogs: Float
var boardFootage: Double
}
它由以下内容填充:
var logInfoArray = [LogInfo]()
logInfoArray.append(LogInfo(logNumber: 1, species: "Spruce", diameter: 18.0, formClass: 78, numLogs: 1.5, boardFootage: 110.0))
logInfoArray.append(LogInfo(logNumber: 2, species: "Spruce", diameter: 17.0, formClass: 78, numLogs: 1.0, boardFootage: 90.0))
logInfoArray.append(LogInfo(logNumber: 3, species: "Pine", diameter: 18.0, formClass: 78, numLogs: 1.5, boardFootage: 89.0))
logInfoArray.append(LogInfo(logNumber: 4, species: "Pine", diameter: 21.0, formClass: 78, numLogs: 1.0, boardFootage: 120.0))
logInfoArray.append(LogInfo(logNumber: 5, species: "Pine", diameter: 19.0, formClass: 78, numLogs: 1.5, boardFootage: 200.0))
logInfoArray.append(LogInfo(logNumber: 6, species: "Oak", diameter: 22.0, formClass: 78, numLogs: 2, boardFootage: 180.0))
我将如何对这些条目执行一些数组函数?
例如 - 我想计算出数组中有多少独特的物种,并最终得到一个包含每个单独物种的新数组。
i.e. var speciesArray = ["Spruce", "Pine", "Oak"]
我还希望能够在考虑这些因素的情况下进行一些计算。比如,计算所有以“Pine”为物种的条目的总长度值。
有人能给我一些建议吗?
提前致谢!
最佳答案
要找到唯一的物种,使用map
创建一个species
的数组,Set
找到唯一的物种,Array
将结果转换回数组:
let unique = Array(Set(logInfoArray.map { $0.species }))
print(unique) // ["Oak", "Pine", "Spruce"]
要查找 Pines 的总长度,请使用 filter
仅选择 Pines,然后使用 reduce
来计算 Pines 的总长度:
let totalBoardFootage = logInfoArray.filter { $0.species == "Pine" }.reduce(0) { $0 + $1.boardFootage }
print(totalBoardFootage) // 409.0
为了更清楚地说明这一点,让我们为闭包中的参数命名。
filter
的工作原理是创建一个新数组,该数组仅包含原始数组中导致闭包返回 true
的那些项。在上面的示例中,过滤器创建了一个新数组,其中仅包含那些以 "Pine"
作为其种类的项目。
reduce
通过对数组中的每个项目调用闭包来工作。每次pass时,第一个参数传入当前的运行总数(reduce(0)
中的0
为初始总数),数组中的当前项作为第二项传入。闭包返回的值是传递给数组中下一项的闭包的新运行总计。
let totalBoardFootage = logInfoArray.filter { item in item.species == "Pine" }.reduce(0) { (total, item) in total + item.boardFootage }
要查找所有项目的总画面,只需省略仅过滤掉 Pines 的部分:
let totalBoardFootageForAllSpecies = logInfoArray.reduce(0) { (total, item) in total + item.boardFootage }
关于arrays - 对结构数组执行数组函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39682725/