Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift reduce元组数组自定义数据模型_Swift_Dictionary_Filter_Tuples_Reduce - Fatal编程技术网

Swift reduce元组数组自定义数据模型

Swift reduce元组数组自定义数据模型,swift,dictionary,filter,tuples,reduce,Swift,Dictionary,Filter,Tuples,Reduce,我试图减少这个CustomDataModel数组中每个相似的“x”值的“y”值分量,并返回一个CustomDataModel数组(或者简单地返回一个元组数组[(Double,Double)] 我对Swift的了解充其量只是初步的,尝试在整个数组中使用如下链接函数会减少,而不是每个“x”值。我不确定如何将reduce函数限制为仅相同的值 let reducedArray = yValues.filter( {$0.x == $0.x}).map({$0.y}).reduce(0, +) 上述函

我试图减少这个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)]

您需要按
x
y值
数组分组到
字典中
。然后将值映射到
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(按: