arrays - 对结构数组执行数组函数

标签 arrays swift function struct swift2

假设我有以下结构:

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/

相关文章:

ruby - 计算 Ruby 数组中相同的字符串元素

javascript - js对象之间的区别

arrays - 给定一个数组,我能否在 O(n) 中找到最长的范围,其端点是范围内的最大值?

ios - 分析屏幕报告已禁用。不会记录 UIViewController 转换

ios - 切换TabBar Item时如何获取上一个ViewController的名称

python - 子程序后打印字符串

c++ - 通过引用传递的不一致 - 这个通过引用传递的简单示例是如何工作的?

javascript - 如何从数组中删除空数组值 ("")?

ruby - Ruby 方法应该返回 nil 还是空对象

ios - 使用 Share 扩展共享类和数据库