【问题标题】:swift 1.2 - grouping tuples by first elementswift 1.2 - 按第一个元素对元组进行分组
【发布时间】:2015-10-13 17:25:03
【问题描述】:

我有一系列不同的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
    }
}

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

谢谢

【问题讨论】:

  • 该代码甚至无法编译...
  • 这是大学作业吗?如果代码至少做了一些事情,它可能有助于获得更好的答案。

标签: arrays swift for-loop tuples


【解决方案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]

【讨论】:

  • 谢谢马科斯!这正是我一直在寻找的。如果我想按字典中的最高键对这个数组进行排序,这将如何实现?我试过 'sorted(dict) {$0.1
  • @JessMurray:结果是字典,而不是数组。字典没有顺序,无法排序。
【解决方案2】:

作为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 &lt; $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)]

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2012-03-13
    • 2012-03-08
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多