ios arrays merge swift append

ios - ¿Cómo concatenar o combinar matrices en Swift?



arrays merge (11)

Si hay dos matrices creadas en swift así:

var a:[CGFloat] = [1, 2, 3] var b:[CGFloat] = [4, 5, 6]

¿Cómo pueden fusionarse a [1, 2, 3, 4, 5, 6] ?


Aquí está la manera más corta de combinar dos matrices.

var array1 = [1,2,3] let array2 = [4,5,6]

Concatenarlos / fusionarlos

array1 += array2 New value of array1 is [1,2,3,4,5,6]


Con Swift 3, de acuerdo con sus necesidades y gustos, puede elegir una de las cinco formas siguientes para concatenar / fusionar dos matrices.

1. Combine dos matrices en una nueva matriz con el operador genérico +(_:_:) Swift standard library

La biblioteca estándar de Swift define un operador genérico +(_:_:) . +(_:_:) tiene la siguiente declaration :

func +<RRC1 : RangeReplaceableCollection, RRC2 : RangeReplaceableCollection where RRC1.Iterator.Element == RRC2.Iterator.Element>(lhs: RRC1, rhs: RRC2) -> RRC1

Crea una nueva colección al concatenar los elementos de dos colecciones.

El siguiente código de Zona de juegos muestra cómo combinar dos matrices de tipo [Int] en una nueva matriz usando el operador genérico +(_:_:) :

let array1 = [1, 2, 3] let array2 = [4, 5, 6] let flattenArray = array1 + array2 print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

2. Agregue una matriz a otra matriz con el método append(contentsOf:) Array

Swift Array tiene un método append(contentsOf:) . append(contentsOf:) tiene la siguiente declaration :

public mutating func append<S>(contentsOf newElements: S) where S : Sequence, S.Iterator.Element == Element)

Agrega los elementos de una secuencia o colección al final de esta colección.

El siguiente código de Zona de juegos muestra cómo agregar una matriz a otra matriz de tipo [Int] usando el método append(contentsOf:) :

var array1 = [1, 2, 3] let array2 = [4, 5, 6] array1.append(contentsOf: array2) print(array1) // prints [1, 2, 3, 4, 5, 6]

3. Combine dos matrices en una nueva matriz con el método flatMap(_:) Sequence

Swift proporciona un flatMap(_:) para todos los tipos que cumplen con el protocolo de Sequence (incluida la Array ). flatMap(_:) tiene la siguiente declaration :

func flatMap<SegmentOfResult : Sequence>(_ transform: (Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]

Devuelve una matriz que contiene los resultados concatenados de llamar a la transformación dada con cada elemento de esta secuencia.

El siguiente código de flatMap(_:) juegos muestra cómo combinar dos matrices de tipo [Int] en una nueva matriz usando el flatMap(_:) :

let array1 = [1, 2, 3] let array2 = [4, 5, 6] let flattenArray = [array1, array2].flatMap({ (element: [Int]) -> [Int] in return element }) print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

4. Combine dos matrices en una nueva matriz con el método Array joined() Sequence y el init(_:) Array .

Swift proporciona un método joined() para todos los tipos que se ajustan al protocolo de Sequence (incluida la Array ). joined() tiene la siguiente declaration :

func joined() -> FlattenSequence<Self>

Devuelve los elementos de esta secuencia de secuencias, concatenadas.

Además, Swift Array tiene un init(_:) . init(_:) tiene la siguiente declaration :

init<S : Sequence where S.Iterator.Element == Element>(_ s: S)

Crea una matriz que contiene los elementos de una secuencia.

Por lo tanto, el siguiente código de Zona de juegos muestra cómo combinar dos matrices de tipo [Int] en una nueva matriz usando el método joined() y el init(_:) :

let array1 = [1, 2, 3] let array2 = [4, 5, 6] let flattenCollection = [array1, array2].joined() // type: FlattenBidirectionalCollection<[Array<Int>]> let flattenArray = Array(flattenCollection) print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

5. Combine dos matrices en una nueva matriz con el método de reduce(_:_:) Array reduce(_:_:)

Swift Array tiene un método de reduce(_:_:) . reduce(_:_:) tiene la siguiente declaration :

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

Devuelve el resultado de llamar al cierre de combinación dado con cada elemento de esta secuencia y un valor acumulado.

El siguiente código de Zona de juegos muestra cómo combinar dos matrices de tipo [Int] en una nueva matriz usando el método de reduce(_:_:) :

let array1 = [1, 2, 3] let array2 = [4, 5, 6] let flattenArray = [array1, array2].reduce([], { (result: [Int], element: [Int]) -> [Int] in return result + element }) print(flattenArray) // prints [1, 2, 3, 4, 5, 6]


Del mismo modo, con los diccionarios de matrices se puede:

var dict1 = [String:[Int]]() var dict2 = [String:[Int]]() dict1["key"] = [1,2,3] dict2["key"] = [4,5,6] dict1["key"] = dict1["key"]! + dict2["key"]! print(dict1["key"]!)

y puede iterar sobre dict1 y agregar dict2 si la "clave" coincide


Marge array que son diferentes tipos de datos:

var arrayInt = [Int]() arrayInt.append(6) var testArray = ["a",true,3,"b"] as [Any] testArray.append(someInt)

Salida:

["a", true, 3, "b", "hi", 3, [6]]


Mi método favorito desde Swift 2.0 se flatten

var a:[CGFloat] = [1, 2, 3] var b:[CGFloat] = [4, 5, 6] let c = [a, b].flatten()

Esto devolverá FlattenBidirectionalCollection así que si solo quieres un CollectionType esto será suficiente y tendrás una evaluación perezosa gratis. Si necesita exactamente el Array, puede hacer esto:

let c = Array([a, b].flatten())


Para completar la lista de posibles alternativas, reduce podría usarse para implementar el comportamiento de aplanar :

var a = ["a", "b", "c"] var b = ["d", "e", "f"] let res = [a, b].reduce([],combine:+)

La mejor alternativa (rendimiento / memoria) entre las presentadas es simplemente flatten , que simplemente envuelve los arreglos originales de forma perezosa sin crear una nueva estructura de arreglos.

Pero LazyColletion cuenta que aplanar no devuelve un LazyColletion , por lo que el comportamiento perezoso no se propagará a la siguiente operación a lo largo de la cadena (mapa, mapa plano, filtro, etc.).

Si la pereza tiene sentido en su caso particular, solo recuerde anteponer o adjuntar un .lazy para flatten() , por ejemplo, modificando la muestra de Tomasz de esta manera:

let c = [a, b].lazy.flatten()


Puedes concatenar las matrices con + , construyendo una nueva matriz

let c = a + b print(c) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]

o agregue una matriz a la otra con += (o append ):

a += b // Or: a.append(contentsOf: b) // Swift 3 a.appendContentsOf(b) // Swift 2 a.extend(b) // Swift 1.2 print(a) // [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]


Si desea que se inserte la segunda matriz después de un índice particular, puede hacer esto (a partir de Swift 2.2):

let index = 1 if 0 ... a.count ~= index { a[index..<index] = b[0..<b.count] } print(a) // [1.0, 4.0, 5.0, 6.0, 2.0, 3.0]


Si no es un gran fanático de la sobrecarga de operadores, o simplemente más de un tipo funcional:

// use flatMap let result = [ ["merge", "me"], ["We", "shall", "unite"], ["magic"] ].flatMap { $0 } // Output: ["merge", "me", "We", "shall", "unite", "magic"] // ... or reduce [[1],[2],[3]].reduce([], +) // Output: [1, 2, 3]


Swift 3.0

Puede crear una nueva matriz sumando dos matrices existentes con tipos compatibles con el operador de suma ( + ). El tipo de la nueva matriz se deduce del tipo de las dos matrices que se agregan,

let arr0 = Array(repeating: 1, count: 3) // [1, 1, 1] let arr1 = Array(repeating: 2, count: 6)//[2, 2, 2, 2, 2, 2] let arr2 = arr0 + arr1 //[1, 1, 1, 2, 2, 2, 2, 2, 2]

Este es el resultado correcto de los códigos anteriores.


var arrayOne = [1,2,3] var arrayTwo = [4,5,6]

si quieres un resultado como: [1,2,3, [4,5,6]]

arrayOne.append(arrayTwo)

El código anterior convertirá a arrayOne como un solo elemento y lo agregará al final de arrayTwo.

si quieres un resultado como: [1, 2, 3, 4, 5, 6] entonces,

arrayOne.append(contentsOf: arrayTwo)

El código anterior agregará todos los elementos de arrayOne al final de arrayTwo.

Gracias.