我有一个整数数组字典,如下所示:
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)是否为此提供了便利方法?
通过组合numbers.values.array
和reduce
功能,您可以在一行代码中简化此操作.
numbers.values.array.reduce([], combine: +) // [5,6,7,2,3,9]
Run Code Online (Sandbox Code Playgroud)
但是,我想注意,由于您使用的是字典,因此无法保证值将被排序,因此您可以使用该sorted
函数来完成此操作:
sorted(numbers.values.array.reduce([], combine: +), <) // [2,3,5,6,7,9]
Run Code Online (Sandbox Code Playgroud)
正如@Jeffery Thomas所说,你也可以使用刚刚在Swift 1.2中添加的flatmap:
sorted(numbers.values.array.flatMap { $0 }, <)
Run Code Online (Sandbox Code Playgroud)
更进一步,使用全局sorted
函数,这<
是无关的,因为它是默认的并使用全局reduce
和flatMap
函数,您可以删除array
Martin R指出的属性,因此可以简化为:
sorted(reduce(numbers.values, [], +))
sorted(flatMap(numbers.values) { $0 })
Run Code Online (Sandbox Code Playgroud)
另一种可能的解决方案
[].join(numbers.values)
Run Code Online (Sandbox Code Playgroud)
如果你想要的顺序中的值对应于排序的字典键,那么它将是
flatMap(sorted(numbers.keys)) { numbers[$0]! }
Run Code Online (Sandbox Code Playgroud)
这称为扁平化,这是一种相对常见的操作.有很多方法可以做到,所以选择一个适合您需求的方法.
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)
Run Code Online (Sandbox Code Playgroud)
flatMap
如果展平后的下一步是映射,则可能是最有用的.
注意:感谢@MartinR提供语法提示.