2014-09-09 2 views
0

Как получить все возможные комбинации элементов из нескольких массивов в Swift?Сбор элементов из нескольких массивов

Вот пример:

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

Количество myArray элементов может изменяться, то же самое для массивов внутри него.

код должен вывести массив, выбрав один элемент из каждого массива в то время, кажется простым, но я не могу видеть это теперь

+0

Покажите нам код, который вы написали. – bdesham

+0

Я не могу понять, как это сделать, но я использую некоторые циклы 'for in' – Carpsen90

ответ

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]] 
+0

Извините, я пропустил' reduce'. – zaph

Смежные вопросы