【问题标题】:swift 4 combinations funcswift 4 组合功能
【发布时间】:2017-10-04 15:37:25
【问题描述】:
func combinations<T>(of array: [[T]]) -> [[T]] {
    return array.reduce([[]]) { combihelper(a1: $0, a2: $1) }
}

func combihelper<T>(a1: [[T]], a2: [T]) -> [[T]] {
    var x = [[T]]()
    for elem1 in a1 {
        for elem2 in a2 {
            x.append(elem1 + [elem2])
        }
    }
    return x
}

在一个函数中更快速地编写代码的最佳解决方案是什么?

【问题讨论】:

  • 您能否提供一个描述并举例说明该函数应该做什么?
  • 是的,当然。它为您提供参数组合。例如, var par = [[Double]]() par.append(Array(stride(from: 0, through: 10, by: 1.0))) par.append(Array(stride(from: -10, through: 0, by: 1.0))) 让 comb = 组合(of: par)

标签: arrays swift combinations


【解决方案1】:

如果您只想将这两种方法合并为一个方法,只需将 a1 更改为 $0 并将 a2 更改为 $1:

func combinations<T>(of array: [[T]]) -> [[T]] {
    return array.reduce([[]]) {
        var x = [[T]]()
        for elem1 in $0 {
            for elem2 in $1 {
                x.append(elem1 + [elem2])
            }
        }
        return x
    }
}

let multi = [[1,2,3,4,5],[1,2,3,4,5,6,7,8,9,0]]
combinations(of: multi)  // [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [2, 9], [2, 0], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [3, 9], [3, 0], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [4, 9], [4, 0], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [5, 9], [5, 0]]

扩展集合,将元素限制为 RangeReplaceableCollection 并使用我们可以想出的高阶函数:

extension Collection where Element: RangeReplaceableCollection  {
    func combinations() -> [Element] {
        reduce([.init()]) { result, element in
            result.flatMap { elements in
                element.map { elements + CollectionOfOne($0) }
            }
        }
    }
}

let strings = ["12345","1234567890"]
strings.combinations()  // ["11", "12", "13", "14", "15", "16", "17", "18", "19", "10", "21", "22", "23", "24", "25", "26", "27", "28", "29", "20", "31", "32", "33", "34", "35", "36", "37", "38", "39", "30", "41", "42", "43", "44", "45", "46", "47", "48", "49", "40", "51", "52", "53", "54", "55", "56", "57", "58", "59", "50"]

【讨论】:

  • 嗯,原来很简单)
【解决方案2】:

您也可以不使用任何 for 循环:

func combinations<T>(of array: [[T]]) -> [[T]]
{
   return array.reduce([[]]){ c,a in c.flatMap{ e in a.map{e + [$0] } } }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多