从多个阵列中挑选元素

时间:2014-09-09 12:37:51

标签: arrays swift

如何从Swift中的多个数组中获取所有可能的元素组合?

以下是一个例子:

let myArray = [[2,3,4],
[1,2,3,4,5],
[1,2],
]

myArray元素的数量可能会有所不同,其中的数组也是如此。

代码应该通过一次从每个数组中选择一个元素来输出一个数组,看起来基本但我现在看不到它

1 个答案:

答案 0 :(得分:2)

使用https://stackoverflow.com/a/20049365/1187415中的想法,可以这样做 在Swift中完成

// Append all elements of a2 to each element of a1
func combihelper(a1 : [[Int]], a2 : [Int]) -> [[Int]] {
    var result = [[Int]]()
    for elem1 in a1 {
        for elem2 in a2 {
            result.append(elem1 + [elem2])
        }
    }
    return result
}

func combinations(array : [[Int]]) -> [[Int]] {
    // Start with the "empty combination" , then successively
    // add combinations with each row of array:
    var result : [[Int]] = [[]]
    for row in array {
        result = combihelper(result, row)
    }
    return result
}

最后一个函数可以更快地编写为

func combinations(array : [[Int]]) -> [[Int]] {
    return reduce(array, [[]]) { combihelper($0, $1) }
}

示例:

let myArray = [[1],
    [2,3,4],
    [5,6],
]
let result = combinations(myArray)
println(result)
// [[1, 2, 5], [1, 2, 6], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6]]

(如果您的输入不限于整数,则可以在上面Int替换Any 功能。)


更新 Swift 3 并作为通用功能,以便它可以 与任何元素类型一起使用:

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

func combinations<T>(of array: [[T]]) -> [[T]] {
    return array.reduce([[]]) { combihelper(a1: $0, a2: $1) }
}


let myArray = [[1],
               [2,3,4],
               [5,6],
]

let result = combinations(of: myArray)
print(result) // [[1, 2, 5], [1, 2, 6], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6]]