如何从Swift中的多个数组中获取所有可能的元素组合?
以下是一个例子:
let myArray = [[2,3,4],
[1,2,3,4,5],
[1,2],
]
myArray
元素的数量可能会有所不同,其中的数组也是如此。
代码应该通过一次从每个数组中选择一个元素来输出一个数组,看起来基本但我现在看不到它
答案 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]]