【问题标题】:Flatten all values of multiple arrays in Swift在 Swift 中展平多个数组的所有值
【发布时间】:2015-04-24 04:14:38
【问题描述】:

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

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)是否为此提供了方便的方法?

【问题讨论】:

    标签: arrays swift


    【解决方案1】:

    结合使用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 函数,&lt; 是无关的,因为它是默认值,使用全局 reduceflatMap 函数,您可以删除 array Martin R 指出的属性,因此可以简化为:

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

    【讨论】:

      【解决方案2】:

      另一种可能的解决方案是

      [].join(numbers.values)
      

      如果你想要排序后的值对应的顺序 字典 keys 那么它将是

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

      【讨论】:

      • 虽然它是模棱两可的,但我会假设您要对最终值数组进行排序,而不是对字典键进行排序。 So sorted(flatMap(numbers.keys){numbers[$0]!}) 没关系,我在上面看到了你的评论。
      【解决方案3】:

      这个叫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 的语法提示。

      【讨论】:

      • flatMap(numbers.values) { $0 },您不需要array 属性。
      • @MartinR 感谢您的提示,flatMapreduce 都可以通过 numbers.values
      猜你喜欢
      • 2014-08-19
      • 2021-10-04
      • 1970-01-01
      • 2017-12-29
      • 2018-05-12
      • 2016-09-10
      • 2019-03-05
      • 2013-03-27
      • 1970-01-01
      相关资源
      最近更新 更多