swift 1.2 - 按第一个元素对元组进行分组

swift 1.2 - grouping tuples by first element

我有各种tuple的数组。我想创建一个 for 循环来添加 tuple 的第二部分,如果第一部分相同的话。

例如我正在寻找结果:

(2014,11) (2015,13)

我生成的代码如下:

var tuple = (Int, Double)
var array = [tuple]
array.append((2014,3),(2014,2),(2014,6),(2015,8),(2015,5)]
var temp = 0

for i in array {
    if tuple.0 = tuple.0 {
    temp += temp
    }
}

这并没有像我预期的那样按年份分组。任何想法将不胜感激:)

谢谢

这段代码可以满足您的需求(在 Swift 2 中):

var dict: Dictionary<Int, Int> = [:]
for t in array {
    dict[t.0] = (dict[t.0] ?? 0) + t.1
}

嗯,有点……结果会是 [2014 : 11, 2015 : 13]

As 我想说字典可能是更好用的数据结构,但如果你坚持保存在元组数组中,你可以使用一些高阶函数疯狂,Swift 2(为什么要使用 1.2?):

let array = [(2014,3),(2014,2),(2014,6),(2015,8),(2015,5)]
let keys = Set(array.map{return [=10=].0})
let result = keys.map{(k:Int) -> (Int,Int) in (k, array.filter{ [=10=].0 == k }.map{ [=10=].1 }.reduce(0, combine:+))}

print(result)

结果

[(2014, 11), (2015, 13)]

请注意,Set 不保证其元素的顺序。事实上它没有顺序。 为了确保您可以使用 sort{[=17=].0 < .0}

的顺序
let result = keys.map{(k:Int) -> (Int,Int) in (k, array.filter{ [=12=].0 == k }.map{ [=12=].1 }.reduce(0, combine:+))}.sort{[=12=].0 < .0}

与字典解决方案相比的一个优势是能够排序。

let result = ....sort{[=13=].0 < .0}

-> [(2014, 11), (2015, 13)]

let result = ....sort{[=14=].0 > .0}

-> [(2015, 13), (2014, 11)]

 let result = ....sort{[=15=].1 > .1}

-> [(2015, 13), (2014, 11)]

let result = ....sort{[=16=].1 < .1}

-> [(2014, 11), (2015, 13)]