Ma première pensée était que vous pourriez faire:
NSArray * a = [NSArray arrayWithObjects:@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE", nil];
NSLog(@"%@", [a valueForKeyPath:@"@distinctUnionOfObjects.self"]);
Mais cela ne maintient pas l'ordre. Par conséquent, vous devez le faire manuellement:
NSArray * a = [NSArray arrayWithObjects:@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE", nil];
NSMutableArray * unique = [NSMutableArray array];
NSMutableSet * processed = [NSMutableSet set];
for (NSString * string in a) {
if ([processed containsObject:string] == NO) {
[unique addObject:string];
[processed addObject:string];
}
}
J'utilise un NSMutableSet
pour déterminer si je suis déjà venu à travers cette entrée avant (par opposition à [unique containsObject:string]
, car un ensemble aura O (1) rechercher le temps, et un tableau a O (n) temps de recherche.Si vous ne traitez qu'un petit nombre d'objets, cela n'aura aucune importance.Cependant, si le tableau source est très grand, alors utiliser l'ensemble pour déterminer l'unicité peut ajouter un peu d'un coup de pouce de vitesse. (toutefois, vous devez utiliser des instruments pour profiler votre code et voir si elle est nécessaire)
Vraiment pas la chose la plus intuitive que @distinctUnionOfObjects brouille l'ordre (les implémentations semblent juste faire l'ancien setWithArray:/allObjects), car il prend et retourne un tableau. –
Merci pour ce post. Je l'ai trouvé très utile, cependant, j'ai également découvert que si vous essayez simplement de charger un deuxième tableau du premier tableau sans doublons, vous n'avez pas besoin de NSMutableSet. vous pouvez simplement utiliser la boucle for et l'instruction if pour vérifier chaque objet et l'ajouter si nécessaire. Très utile. Merci – Miek