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