Swift 减少元组数组自定义数据模型

Posted

技术标签:

【中文标题】Swift 减少元组数组自定义数据模型【英文标题】:Swift reduce tuple array custom data model 【发布时间】:2020-12-14 20:51:14 【问题描述】:

我正在尝试减少此 CustomDataModel 数组中每个相似“x”值的“y”值分量,并返回一个 CustomDataModel 数组(或只是一个元组数组 [(Double, Double)]。

我对 Swift 的了解充其量只是初级知识,并且尝试使用如下链接函数会减少整个数组而不是每个“x”值。我不确定如何将 reduce 函数限制为仅类似的值。

let reducedArray = yValues.filter( $0.x == $0.x).map($0.y).reduce(0, +)

上述函数减少了所有 y 值,而不是每个 x。 下面是一个模型和一些虚拟数据:

struct CustomDataModel 
    var x : Double
    var y : Double


let yValues: [CustomDataModel] = [
CustomDataModel(x: 0.0, y: 10.0),
CustomDataModel(x: 1.0, y: 5.0),
CustomDataModel(x: 1.0, y: 12.5),
CustomDataModel(x: 1.0, y: 14.5),
CustomDataModel(x: 1.0, y: 18.45),
CustomDataModel(x: 5.0, y: 11.4),
CustomDataModel(x: 5.0, y: 9.4),
CustomDataModel(x: 5.0, y: 18.4),
CustomDataModel(x: 5.0, y: 5.0),
CustomDataModel(x: 9.0, y: 7.6),
CustomDataModel(x: 9.0, y: 13.5),
CustomDataModel(x: 9.0, y: 18.5),
CustomDataModel(x: 9.0, y: 17.6),
CustomDataModel(x: 9.0, y: 14.3),
CustomDataModel(x: 14.0, y: 19.6),
CustomDataModel(x: 14.0, y: 17.8),
CustomDataModel(x: 14.0, y: 20.1),
CustomDataModel(x: 14.0, y: 21.5),
CustomDataModel(x: 14.0, y: 23.4),
]

理想情况下,我的输出应该是这样的:

print(reducedArray)
//[(0.0, 10.0), (1.0, 50.45), (5.0, 44.2), (9.0, 71.5), (14.0, 102.4)]

【问题讨论】:

【参考方案1】:

您需要将yValues 数组按x 分组为Dictionary。并将值映射到y,然后执行reduce。方法如下:

let reducedArray = Dictionary(grouping: yValues, by: \.x).mapValues( $0.map(\.y).reduce(0, +) )
print(reducedArray)

更新:如果您要求结果为[(Double, Double)] 格式,您可以将上述结果映射到元组。

【讨论】:

感谢弗兰肯斯坦的快速回答。生成字典可以工作,因为我可以对其进行排序,但无论如何都要维护元组结构 [(double, double)] 因为应用程序需要我能够迭代索引。 我想我是这样做的:let mapped = reducedArray.map$0.sorted(by: <)

以上是关于Swift 减少元组数组自定义数据模型的主要内容,如果未能解决你的问题,请参考以下文章

自定义对象在swift中减少类似键的值

在 Swift 中将模型附加到数组中

如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据

C 语言二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一二 模型数据拷贝到 三 模型中 并 排序 )

关系模型和关系运算理论

Swift - 1 (常量变量字符串数组字典元组循环枚举函数)