2015-10-13 143 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)]

相關問題