在Swift中展平多个数组的所有值

时间:2015-04-24 04:14:39

标签: arrays swift

我有一个整数数组字典,如下所示:

let numbers = [1: [2, 3], 4: [5, 6, 7], 8: [9]]

我真正想要的是所有值的单个扁平数组(它们本身就是数组),如下所示:

[2, 3, 5, 6, 7, 9]

现在,我可以致电numbers.values.array来获取:

[[2, 3], [5, 6, 7], [9]]

但我正在寻找的是将这一步进一步合并,使它们变得扁平化。

Swift(1.1或1.2)是否为此提供了便利方法?

3 个答案:

答案 0 :(得分:6)

通过numbers.values.arrayreduce功能的组合,您可以在一行代码中简化此功能。

numbers.values.array.reduce([], combine: +) // [5,6,7,2,3,9]

但是,我想注意,由于您使用的是字典,因此无法保证对值进行排序,因此您可以使用sorted函数来完成此操作:

sorted(numbers.values.array.reduce([], combine: +), <) // [2,3,5,6,7,9]

正如@Jeffery Thomas所说,你也可以使用刚刚在Swift 1.2中添加的flatmap:

sorted(numbers.values.array.flatMap { $0 }, <)

为了更进一步,使用全局sorted函数,<是无关紧要的,因为它是默认设置并使用全局reduceflatMap函数,您可以删除Martin R指出的array属性,因此可以将其缩小为:

sorted(reduce(numbers.values, [], +))
sorted(flatMap(numbers.values) { $0 })

答案 1 :(得分:6)

另一种可能的解决方案是

[].join(numbers.values)

如果您希望订单中的值对应于已排序的 字典那么它将是

flatMap(sorted(numbers.keys)) { numbers[$0]! }

答案 2 :(得分:5)

这称为flattening,这是一个相对常见的操作。有很多方法可以做到,所以选择一个适合你需要的方法。

numbers.values.array.reduce([], combine: +) // As stated by @Bluehound
reduce(numbers.values, [], +)
numbers.values.array.flatMap { $0 } // Swift 1.2 (Xcode 6.3)
flatMap(numbers.values) { $0 } // Swift 1.2 (Xcode 6.3)
如果展平后的下一步是映射,则

flatMap可能是最有用的。

注意:感谢@MartinR提供语法提示。