¿Hay una contraparte en Swift to flatten
en Scala, Xtend, Groovy, Ruby y compañía?
var aofa = [[1,2,3],[4],[5,6,7,8,9]]
aofa.flatten() // shall deliver [1,2,3,4,5,6,7,8,9]
por supuesto que podría usar reducir para eso, pero eso apesta
var flattened = aofa.reduce(Int[]()){
a,i in var b : Int[] = a
b.extend(i)
return b
}
Respuestas:
Swift> = 3.0
reduce
:flatMap
:joined
:fuente
flatMap
está disponible a partir de Swift 1.2.joined
(formalmente conocido comoflatten
) conflatMap
? Es que mientras seflatMap
une, también puede mapear / transformar cosas. pero aquí en el ejemplo realmente no necesitamos, es decir, volvemos$0
flatMap
será ya sea aplanar una matriz 2D en una matriz de 1D o quitannil
valores, no ambos. Determina qué hacer en función de si la matriz del primer nivelElement
es una matriz u opcional, por lo que si le pasa una matriz 2D de opciones (por ejemplo[[Int?]]
) , elegirá aplanarla a 1D (por ejemplo[Int?]
) . Para aplanar a 1-D y eliminar nulos de segundo nivel, tendría que hacerloarray.flatMap { $0 }.flatMap { $0 }
. En otras palabras, el achatamiento de dimensión es equivalenteArray(array.joined())
y el "aplanamiento" de eliminación nula es equivalentearray.filter{ $0 != nil }.map{ $0! }
.flatMap
sigue siendo apropiado para el uso descrito en la pregunta (alisar una matriz 2D a 1D).compactMap
es explícitamente para eliminarnil
elementos de una secuencia, como lo hizo una variante deflatMap
una vez.[[Any]]
,flatMap
simplemente la transforma en un tipo de[Any]
([1, 2, 3, 4, [5, 6], 7, 8, 9]). Y si volviéramos a presentarflatMap
una solicitud , actuaríamos según un `¿Alguno? tipo, donde el compilador ya no sabe si es un valor simple o una matriz en sí misma.En biblioteca estándar Swift hay
joined
función implementada para todos los tipos conformes conSequence
el protocolo (oflatten
enSequenceType
antes de Swift 3), que incluyeArray
:En ciertos casos, el uso de
joined()
puede ser beneficioso ya que devuelve una colección diferida en lugar de una nueva matriz, pero siempre se puede convertir en una matriz cuando se pasa alArray()
iniciador como en el ejemplo anterior.fuente
FlattenBidirectionalCollection<Array<Array<Int>>>(_base: [[1, 2, 3], [4], [5, 6, 7, 8, 9]]))
. Sin embargo, su punto es válido para poder acceder a él como una matriz plana, por lo que parece que laCustomStringConvertable
implementación es engañosa. Sin embargo, su fragmento de código era y aún falta una prueba.flatten()
se le cambió el nombre ajoined()
Swift 4.x / 5.x
Solo para agregar un poco más de complejidad en la matriz, si hay una matriz que contiene una matriz de matrices, entonces
flatMap
realmente fallará.Supongamos que la matriz es
Lo que
flatMap
ocompactMap
devuelve es:Para resolver este problema, podemos usar nuestro simple for loop logic + recursion
Entonces llame a esta función con la matriz dada
El resultado es:
Esta función ayudará a aplanar cualquier tipo de matriz, considerando el caso de
Int
aquíSalida del patio de recreo:
fuente
Swift 4.x
Este uso de
flatMap
no está en desuso y está hecho para esto. https://developer.apple.com/documentation/swift/sequence/2905332-flatmapfuente
Editar: Use en su
joined()
lugar:https://developer.apple.com/documentation/swift/sequence/2431985-joined
Respuesta original:
fuente
Swift 4.2
Escribí una extensión de matriz simple a continuación. Puede usar para aplanar una matriz que contiene otra matriz o elemento. a diferencia del método join ().
uso:
fuente
Otra implementación más genérica de
reduce
,Esto logra lo mismo, pero puede dar más información sobre lo que está sucediendo
reduce
.De los documentos de Apple,
Descripción
Devuelve el resultado de llamar repetidamente a combinar con un valor acumulado inicializado a inicial y cada elemento de secuencia , a su vez.
fuente
Use of unresolved identifier 'reduce'
Respuesta de @ RahmiBozdag modificada, 1. Los métodos en extensiones públicas son públicos. 2. Se eliminó el método adicional, ya que el índice de inicio siempre será cero. 3. No encontré una manera de poner compactMap dentro de nil y opcionales porque dentro del método T siempre es [Any?], Cualquier sugerencia es bienvenida.
fuente
Puede aplanar una matriz anidada utilizando el siguiente método:
fuente
Apple Swift versión 5.1.2 (swiftlang-1100.0.278 clang-1100.0.33.9)
Objetivo: x86_64-apple-darwin19.2.0
fuente
Swift 5.1
En caso de que también lo desee para los valores del Diccionario:
fuente
flatten()
fue renombradojoined()
en Swift 3 por SE-0133:https://github.com/apple/swift-evolution/blob/master/proposals/0133-rename-flatten-to-joined.md
fuente
matriz es [[myDTO]]?
En swift 5 puede usar this = Array (self.matrix! .Joined ())
fuente
fuente