【问题标题】:Flatten Array of Any展平任何数组
【发布时间】:2018-03-26 22:56:18
【问题描述】:

如何展平 Swift 4 中的 Any 数组。 示例: 假设我有一个数组:var array:[Any] = [1, 2, [4, 3], [9, [8, 0]]],在展平这个数组之后,我的预期结果是[1, 2, 4, 3, 9, 8, 0]。我尝试使用flatMap,但没有成功。

【问题讨论】:

  • @RayToal:谢谢,这个链接很有帮助。但是你能和我分享key word 谷歌搜索得到这个结果吗?我只是尝试过,但没有得到相同的结果。只是想提高我的搜索技能:)。非常感谢
  • 啊,我刚刚认识到该操作是“扁平化”(来自 45 年的编程经验),并且您在数组中的数组中扁平化数组这一事实是“递归的”,所以我搜索了“swift flatten list”递归”
  • 非常感谢分享。

标签: ios arrays join swift4 flatmap


【解决方案1】:

就像 Ray Toal 建议的那样(来自https://rosettacode.org/wiki/Flatten_a_list#Swift

func flatten<T>(_ s: [Any]) -> [T] {
    var r = [T]()
    for e in s {
        switch e {
        case let a as [Any]:
            r += flatten(a)
        case let x as T:
            r.append(x)
        default:
            assert(false, "value of wrong type")
        }
    }
    return r
}

此函数的作用如下,它遍历数组中的每个元素,如果在您的情况下找到 Int ,则将其添加到结果中,如果找到 [Any] 数组,则调用自身(递归调用)并且过程重复,直到每个案例都到达最里面的 Int。然后在最后返回结果。注意asset,如果您的数组不是Ints 和Ints ([Int]) 的数组,则会抛出该数组

那么你可以这样做:

var array:[Any] = [1, 2, [4, 3], [9, [8, 0]]]
array = flatten(array)
//result [1, 2, 4, 3, 9, 8, 0]

【讨论】:

    【解决方案2】:

    尝试使用Array的reduce和joined函数。

    var array:[Any] = [1, 2, [4, 3], [9, [8, 0]]]
    
       var flatArray = array.reduce([],+]
    
    else 
    
       var flatArray = Array(array.joined())
    

    【讨论】:

    • 它们都对我不起作用。我收到了reduce 的错误:Ambiguous reference to member '+'
    • 使用joined 我得到了错误Ambiguous reference to member 'joined()'。我用Xcode9.1 beta2 Playground
    猜你喜欢
    • 2018-05-12
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2019-11-24
    • 2011-02-11
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多