Supprimer les mêmes valeurs d'un tableau
Bonjour,
Serait-il possible de m'expliquer le code suivant, surtout l'entête de la fonction.
Ce code permet de supprimer les mêmes valeurs d'un tableau.
func uniq<S : SequenceType, T : Hashable where S.Generator.Element == T>(source: S) -> [T] {
var buffer = [T]()
var added = Set<T>()
for elem in source {
if !added.contains(elem) {
buffer.append(elem)
added.insert(elem)
}
}
return buffer
}
let vals = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]
let uniqueVals = uniq(vals) // [1, 4, 2, 6, 24, 15, 60]
Merci.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Euh .. je comprend le principe de la routine, mais l'entête est delà de ma compréhension. C'est du code générique permettant de travailler avec des tableaux contenant n'importe quel type d'objet.
Pour le reste c'est simple.
On crée un tableau vide buffer d'objet de type T (le type du tableau générique).
Et added un Set d'objets T. C'est à dire une collection ne pouvant contenir que des objects uniques.
Ensuite on parcourt la liste des objets d'origine pour la comparer avec la collection. Si un objet n'est pas présent c'est la première fois que l'on le rencontre. On l'archive alors dans la collection et on l'ajoute au tableau buffet.
A la fin, on retourne le tableau buffer, avec le type générique T.
L'entête c'est long et ça parait compliqueÌ mais c'est simple.
Une fonction de type function<x> est une fonction geÌneÌrique. C'est à dire qu'on va connaà®tre les types manipuleÌs à l'exeÌcution.
On va la deÌcomposer :
- S : SequenceType → On deÌfinit un alias S pour un type qui sera donneÌ en entreÌe (ici source: S). Tout ce qu'on dit c'est qu'on ne sait pas ce que sera le type de S mais on sait qu'il répondra au protocol SequenceType.
- T : Hashable where S.Generator.Element == T → Ici encore on deÌfinit un alias (T en l'occurence). Il sert à speÌcifier la valeur de retour donc on dit juste "tu renvoie un tableau d'objets de type T". On sait de ces objets qu'ils répondent au protocol Hashable (T : Hashable) mais aussi que ce type T est le type des objets contenu dans la source d'alias S (S.Generator.Element == T).
Grosso modo ça veut dire que ta function pour fonctionner doit recevoir une sequence (Array, Set, Slice, etc...) dont les objets répondent au protocol Hashable et qu'elle te renverra alors un tableau contenant des objets du même type que ceux de la seÌquence passeÌe en entreÌe.
Je te conseille d'aller jeter un oeil sur les docs de SequenceType et Hashable pour mieux comprendre.
Merci prof.
Est-ce que setWithArray de NSSet ne ferait pas le travail puisqu'un NSSet ne contient qu'une occurence d'un objet ?
L'inconvénient est qu'un NSSet n'étant pas ordonné, l'ordre initial sera perdu. Nous ignorons ici si c'est un problème ou non.
D'autre part, autant penser à la manière de Swift dès à présent. Les jours de Foundation dans Swift sont comptés: je ne retrouve plus l'annonce, mais cette framework va être réécrite pour faire de Swift un vrai langage multi-plateforme.
Ma question serait plutôt: peut-on écrire ce code d'une manière fonctionnelle ?
Magnifique de simplicité !
Ouais mais c'est pas Swifty et faut caster en plus...
Je propose ça :
C'est moins lisible par un noob. Il n'y a pas moyen d'écrire la même chose en une seule ligne, sans passer par les opérateurs génériques ?
sujet intéressant en tous les cas. Y'à plus qu'a tester les performances des différents solutions ;-)
C'est pas un cast, c'est un des constructeurs de NSOrderedSet
Hello,
J'ai commis ça (ça doit être la deuxième fois que j'écris un truc en Swift ;-)
C'est une solution fonctionnelle je pense @Céroce.
Pour le coup, j'ai ouvert un playground pour la première (mon ordi n'a pas apprécié et au bout de 10 minutes, Xcode ne répondait plus et le Finder n'était pas content non plus : reboot)
Le compilateur n'est pas content du tout... Si vous avez des pistes et explications...
ça promet d'être sympa Swift...
Sur ce point on est d'accord mais comme il veut un [Int] il va falloir caster quand même.
OK, tous en Swift, sans cast, mais ce n'est plus trié...
Mais, on a déjà rédigé un OrderedSet en Swift https://github.com/Weebly/OrderedSet/blob/master/Sources/OrderedSet.swift