我有一个整数数组字典,如下所示:
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)是否为此提供了便利方法?
答案 0 :(得分:6)
通过numbers.values.array
和reduce
功能的组合,您可以在一行代码中简化此功能。
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
函数,<
是无关紧要的,因为它是默认设置并使用全局reduce
和flatMap
函数,您可以删除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提供语法提示。