Перестановка / Комбинации нескольких массивов / Генерация декартовых произведений в быстром - PullRequest
0 голосов
/ 22 октября 2019

У меня есть пример 4 массивов, описывающих

let arrColor = ["red","green","blue"]
let arrSize = ["L","M"]
let arrMaterial = ["Cotton","polyester"]
let arrstyle = ["Eastern","Western"]

Мне нужны все возможные комбинации продуктов из этих массивов.

1 Ответ

0 голосов
/ 22 октября 2019

Эта концепция называется созданием декартовых произведений. Мы можем использовать следующий код из здесь , чтобы сделать это

let arrColor = ["red","green","blue"]
let arrSize = ["L","M"]
let arrMaterial = ["Cotton","polyester"]
let arrstyle = ["Eastern","Western"]


func + <T>(el: T, arr: [T]) -> [T] {
    var ret = arr
    ret.insert(el, at: 0)
    return ret
}

func cartesianProduct<T>(_ arrays: [T]...) -> [[T]] {
    guard let head = arrays.first else {
        return []
    }
    let first = Array(head)
    func pel(
        _ el: T,
        _ ll: [[T]],
        _ a: [[T]] = []
        ) -> [[T]] {
        switch ll.count {
        case 0:
            return a.reversed()
        case _:
            let tail = Array(ll.dropFirst())
            let head = ll.first!

            return pel(el, tail, el + head + a)
        }
    }
    return arrays.reversed()
        .reduce([first], {res, el in el.flatMap({ pel($0, res) }) })
        .map({ $0.dropLast(first.count) })
}

let arrResult = cartesianProduct(arrColor,arrSize,arrMaterial,arrstyle)
print(arrResult)

Вывод:

[["red", "L", "Cotton", "Eastern"], ["red", "L", "Cotton", "Western"], ["red", "L", "polyester", "Eastern"], ["red", "L", "polyester", "Western"], ["red", "M", "Cotton", "Eastern"], ["red", "M", "Cotton", "Western"], ["red", "M", "polyester", "Eastern"], ["red", "M", "polyester", "Western"], 
["green", "L", "Cotton", "Eastern"], ["green", "L", "Cotton", "Western"], ["green", "L", "polyester", "Eastern"], ["green", "L", "polyester", "Western"], ["green", "M", "Cotton", "Eastern"], ["green", "M", "Cotton", "Western"], ["green", "M", "polyester", "Eastern"], ["green", "M", "polyester", "Western"], 
["blue", "L", "Cotton", "Eastern"], ["blue", "L", "Cotton", "Western"], ["blue", "L", "polyester", "Eastern"], ["blue", "L", "polyester", "Western"], ["blue", "M", "Cotton", "Eastern"], ["blue", "M", "Cotton", "Western"], ["blue", "M", "polyester", "Eastern"], ["blue", "M", "polyester", "Western"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...