Y a-t-il une contrepartie dans Swift à flatten
Scala, Xtend, Groovy, Ruby and co?
var aofa = [[1,2,3],[4],[5,6,7,8,9]]
aofa.flatten() // shall deliver [1,2,3,4,5,6,7,8,9]
Bien sûr, je pourrais utiliser réduire pour ça mais ça craint un peu
var flattened = aofa.reduce(Int[]()){
a,i in var b : Int[] = a
b.extend(i)
return b
}
Réponses:
Swift> = 3,0
reduce
:flatMap
:joined
:la source
flatMap
est disponible à partir de Swift 1.2.joined
(officiellement connu sous le nom deflatten
) avecflatMap
? Est-ce que pendant lesflatMap
jointures, il peut également mapper / transformer des choses. mais ici, dans l'exemple, nous n'avons vraiment pas besoin, c'est-à-dire que nous revenons$0
flatMap
se soit aplatir un tableau 2D dans un tableau 1D ou removenil
valeurs, mais pas les deux. Il détermine ce qu'il faut faire en fonction si le tableau de premier niveauElement
est un tableau ou facultatif - donc si vous lui passez un tableau 2D d'options (par exemple[[Int?]]
), il choisira de l'aplatir en 1D (par exemple[Int?]
) . Pour à la fois aplatir en 1-D et supprimer les nils de 2e niveau, vous devez le fairearray.flatMap { $0 }.flatMap { $0 }
. En d'autres termes, l'aplatissement des dimensions équivaut àArray(array.joined())
et l '«aplatissement» de suppression de zéro équivaut àarray.filter{ $0 != nil }.map{ $0! }
.flatMap
est toujours approprié pour l'utilisation décrite dans la question (aplatissement d'un tableau 2D en 1D).compactMap
est explicitement pour supprimer desnil
éléments d'une séquence, comme une variante de l'flatMap
a fait une fois.[[Any]]
, aflatMap
le transforme simplement en un type de[Any]
([1, 2, 3, 4, [5, 6], 7, 8, 9]). Et si nous postulions àflatMap
nouveau, nous agirions sur un «Any? type, où le compilateur ne sait plus s'il s'agit d'une valeur simple ou d'un tableau lui-même.Dans la bibliothèque standard Swift il est
joined
fonction mise en oeuvre pour tous les types conformes auSequence
protocole (ouflatten
surSequenceType
avant Swift 3), qui comprendArray
:Dans certains cas, l'utilisation de
joined()
peut être bénéfique car elle renvoie une collection différée au lieu d'un nouveau tableau, mais peut toujours être convertie en tableau lorsqu'elle est transmise à l'Array()
initialiser comme dans l'exemple ci-dessus.la source
FlattenBidirectionalCollection<Array<Array<Int>>>(_base: [[1, 2, 3], [4], [5, 6, 7, 8, 9]]))
. Votre argument est valable cependant que vous pouvez y accéder comme un tableau plat, il semblerait donc que laCustomStringConvertable
mise en œuvre soit trompeuse. Cependant, votre extrait de code manquait et il manque toujours un test.flatten()
a été renommé enjoined()
Swift 4.x / 5.x
Juste pour ajouter un peu plus de complexité au tableau, s'il existe un tableau contenant un tableau de tableaux, alors
flatMap
échouera en fait.Supposons que le tableau soit
Ce que
flatMap
oucompactMap
retourne est:Afin de résoudre ce problème, nous pouvons utiliser notre logique de boucle for simple + récursivité
Appelez donc cette fonction avec le tableau donné
Le résultat est:
Cette fonction aidera à aplatir tout type de tableau, en considérant le cas de
Int
iciSortie de terrain de jeu:
la source
Swift 4.x
Cette utilisation de
flatMap
n'est pas obsolète et c'est fait pour cela. https://developer.apple.com/documentation/swift/sequence/2905332-flatmapla source
Modifier: utiliser
joined()
place:https://developer.apple.com/documentation/swift/sequence/2431985-joined
Réponse originale:
la source
Swift 4.2
J'ai écrit une simple extension de tableau ci-dessous. Vous pouvez utiliser pour aplatir un tableau qui contient un autre tableau ou élément. contrairement à la méthode join ().
usage:
la source
Une autre implémentation plus générique de
reduce
,Cela accomplit la même chose mais peut donner plus d'informations sur ce qui se passe dans
reduce
.À partir de la documentation d'Apple,
La description
Renvoie le résultat d'appels répétés combiner avec une valeur accumulée initialisée à initial et chaque élément de séquence , à son tour.
la source
Use of unresolved identifier 'reduce'
Réponse modifiée de @ RahmiBozdag, 1. Les méthodes dans les extensions publiques sont publiques. 2. Suppression de la méthode supplémentaire, car l'index de départ sera toujours zéro. 3. Je n'ai pas trouvé de moyen de mettre compactMap à l'intérieur pour nil et optionnel car à l'intérieur de la méthode T est toujours [Any?], Toutes les suggestions sont les bienvenues.
la source
Vous pouvez aplatir un tableau imbriqué à l'aide de la méthode suivante:
la source
Apple Swift version 5.1.2 (swiftlang-1100.0.278 clang-1100.0.33.9)
Cible: x86_64-apple-darwin19.2.0
la source
Swift 5.1
Si vous le souhaitez également pour les valeurs du dictionnaire:
la source
flatten()
a été renommé enjoined()
en Swift 3 par SE-0133:https://github.com/apple/swift-evolution/blob/master/proposals/0133-rename-flatten-to-joined.md
la source
matrice est [[myDTO]]?
Dans swift 5, vous pouvez utiliser this = Array (self.matrix! .Joined ())
la source
la source