【问题标题】:Swift reduce tuple array custom data modelSwift 减少元组数组自定义数据模型
【发布时间】: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)]

【问题讨论】:

    标签: swift dictionary filter tuples reduce


    【解决方案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: <)
    猜你喜欢
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2016-03-13
    • 2019-11-15
    • 2019-09-09
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    相关资源
    最近更新 更多