2015-10-13 109 views
-2

我有各种各样的tuple。如果第一部分相同,我想创建一个for循环,该循环添加tuple的第二部分。swift 1.2 - 通过第一个元素对元组进行分组

例如我寻找结果:

(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 
    } 
} 

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

感谢

+3

该代码甚至没有编译... –

+0

这是一种大学任务吗?如果代码至少可以做某些事情,它可以帮助获得更好的答案。 – courteouselk

回答

1

此代码你想要做什么(在斯威夫特2):

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

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

+0

谢谢马科斯!这正是我所期待的。 如果我想按照字典中的最高键排列这个数组,这将如何实现?我试过'排序(字典){$ 0.1 <$ 1.1}',但它似乎没有工作。 谢谢! –

+0

@JessMurray:结果是一个字典,而不是一个数组。词典没有顺序,因此无法排序。 – vikingosegundo

0

As 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)] 

注意到,一组不保证其内容的顺序。实际上它没有秩序。 为了确保您可以使用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} 

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

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

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

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

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

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

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

相关问题