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

5
我有一个整数数组字典,如下所示: 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个回答

7

通过使用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 })

6
另一个可能的解决方案是:
[].join(numbers.values)

如果你想按照已排序字典的 的顺序获取值,则应该这样做:

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

虽然有些含糊,但我认为您想要对最终值数组进行排序,而不是对字典键进行排序。因此,可以使用以下代码:sorted(flatMap(numbers.keys){numbers[$0]!}) 。不过,我看到了您上面的评论,所以可以忽略我的建议。 - Price Ringo

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)
< p > flatMap 可能是最有用的,如果展开后下一步是映射。

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


2
或者使用 flatMap(numbers.values) { $0 },不需要 array 属性。 - Martin R
@MartinR 感谢您的提示,flatMapreduce都可以传递numbers.values - Jeffery Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接