Mi idea inicial fue que podrías hacer:
NSArray * a = [NSArray arrayWithObjects:@"ONE", @"ONE", @"ONE", @"TWO", @"THREE", @"THREE", nil];
NSLog(@"%@", [a valueForKeyPath:@"@distinctUnionOfObjects.self"]);
Pero eso no mantiene el orden. Por lo tanto, hay que hacerlo de forma manual:
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];
}
}
utilizo un NSMutableSet
para determinar si ya he encontrado con esta entrada antes (en contraposición a [unique containsObject:string]
, ya que un conjunto tendrá O (1) tiempo de búsqueda, y una matriz tiene O (n) tiempo de búsqueda. Si solo está tratando con una pequeña cantidad de objetos, entonces esto no importará. Sin embargo, si la matriz de origen es muy grande, entonces usar el conjunto para determinar la singularidad puede agregar un poco de un impulso de velocidad. (Sin embargo, se debe utilizar instrumentos para perfilar el código y ver si es necesario)
Realmente no es lo más intuitivo que @distinctUnionOfObjects arruina el orden (las implementaciones simplemente parecen hacer el antiguo setWithArray:/allObjects), ya que toma y devuelve una matriz. –
Gracias por esta publicación. Me pareció muy útil, sin embargo, también descubrí que si solo estás tratando de cargar una segunda matriz de la primera matriz sin duplicados, entonces no necesitas NSMutableSet. simplemente puede usar el bucle for y la instrucción if para verificar cada objeto y agregarlo si es necesario. Muy útil. Gracias – Miek