Как мне объединить два массива в один в Swift? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть два массива:

var array1: [String] = ["l1", "m2", "r3"]
var array2: [String] = ["l4", "m5", "r6"]

Как я могу объединить их в массив, который выглядит как

var combinations: [[String]] = [
["l1", "m2", "r3"], ["l1", "m5", "r3"], ["l1", "m5", "r6"], ["l1", "m2", "r6"],
["l4", "m2", "r3"], ["l4", "m5", "r3"], ["l4", "m5", "r6"], ["l4", "m2", "r6"]
]

РЕДАКТИРОВАТЬ 1 : В случае, если у вас более 2 массивов

let arrays: [[String]] = [array1, array2, moreArrays]
var combinations: [[String]] = []

let arraysLen: Int = arrays.count
let arrLen: Int = arrays[0].count
let numCombinations: Int = Int(pow(Double(arraysLen), Double(arrLen)))

for i in (0 ..< numCombinations) {
  var combination: [String] = []
  for j in (0 ..< arrLen) {
    let arrIndex: Int = i / Int(pow(Double(arraysLen), Double(j))) % arraysLen
    let elIndex: Int = arrLen - j - 1
    combination.insert(arrays[arrIndex][elIndex], at: 0)
  }
  combinations.append(combination)
}

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Если оба массива одинаковы, повторяйте массивы и объекты подкачки на каждой итерации из исходного массива и добавляйте к результату.

var combinations: [[String]] = []
if array1.count == array2.count {
    combinations.append(array1)
    combinations.append(array2)
    for i in 0..<array1.count {
        var arr1 = array1
        var arr2 = array2
        (arr1[i], arr2[i]) = (arr2[i], arr1[i])
        combinations.append(arr1)
        combinations.append(arr2)
    }
    print(combinations)
}

[["l1", "m2", "r3"], ["l4", "m5", "r6"], ["l4", "m2", "r3"], ["l1", "m5", "r6"],
["l1", "m5", "r3"], ["l4", "m2", "r6"], ["l1", "m2", "r6"], ["l4", "m5"," r3 "]]

1 голос
/ 04 июня 2019

Если вы хотите получить возможные комбинации ровно двух массивов, вы можете использовать простой битовый трюк:

var array1: [String] = ["l1", "m2", "r3"]
var array2: [String] = ["l4", "m5", "r6"]

guard array1.count == array2.count else {
    fatalError("Array must be of the same lenght")
}

let numCombinations = 1 << array1.count
let combinations: [[String]] = (0..<numCombinations).map { (index: Int) in
    return Array((0..<array1.count).map { (elementIndex: Int) in
        // every bit decides which array to choose
        let chooseArray1 = (index & (1 << elementIndex)) == 0
        return chooseArray1 ? array1[elementIndex] : array2[elementIndex]
    })
}
print(combinations) // [["l1", "m2", "r3"], ["l4", "m2", "r3"], ["l1", "m5", "r3"], ["l4", "m5", "r3"], ["l1", "m2", "r6"], ["l4", "m2", "r6"], ["l1", "m5", "r6"], ["l4", "m5", "r6"]]
...