swift 1.2 - 按元素分组元组

时间:2015-10-13 17:25:04

标签: arrays swift for-loop tuples

我有各种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
    }
}

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

由于

2 个答案:

答案 0 :(得分:1)

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

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

嗯,有点......结果将是[2014 : 11, 2015 : 13]

答案 1 :(得分:0)

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

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

print(result)

结果

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

请注意,Set不保证其元素的顺序。实际上它没有订单。 要确保订单,您可以使用sort{$0.0 < $1.0}

let result = keys.map{(k:Int) -> (Int,Int) in (k, array.filter{ $0.0 == k }.map{ $0.1 }.reduce(0, combine:+))}.sort{$0.0 < $1.0}

字典解决方案的一个优点是能够排序。

let result = ....sort{$0.0 < $1.0}

- &GT; [(2014, 11), (2015, 13)]

let result = ....sort{$0.0 > $1.0}

- &GT; [(2015, 13), (2014, 11)]

 let result = ....sort{$0.1 > $1.1}

- &GT; [(2015, 13), (2014, 11)]

let result = ....sort{$0.1 < $1.1}

- &GT; [(2014, 11), (2015, 13)]