Ordenar un NSArray por otro nsarray con ids

A continuación, le indicamos cómo puede hacerlo utilizando un comparador personalizado:

 NSArray* sorted= [arr1 sortedArrayUsingComparator: ^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) { return [arr2 indexOfObject:obj1[@"id"]] - [arr2 indexOfObject:[obj2[@"id"]]; }]; 

Exploté el hecho de que NSComparisonResult tiene +1 para representar un order ascendente, -1 para descendente y 0 para representar el mismo order.

El problema con el uso de sortedArrayUsingComparator: ¿comienza a tratar con O(n^2) times de búsqueda. Para cada comparación de orderación en la primera matriz, debe hacer una búsqueda en la segunda matriz.

Su mejor opción es aprovechar una tabla hash para networkingucirlo a O(n) complejidad media.

Su primer paso es crear un dictionary usando id como key. El resultado sería algo así como @{@1: @{@"id":@"1"}, ...} . Luego, solo tienes que build una matriz haciendo un arr3 través de arr3 y agarrando los valores.

 NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}]; NSArray *arr2 = @[@3,@1,@4,@2]; NSMutableDictionary *map = [NSMutableDictionary dictionary]; for (NSDictionary *item in arr1) { map[item[@"id"]] = item; } NSMutableArray *arr3 = [NSMutableArray array]; for (id key in arr2) { [arr3 addObject:map[key]]; } 

Esta solución, por supuesto, asume la paridad entre las dos matrices. Si arr2 tiene un elemento que no está en arr1 , se bloqueará cuando intente agregar nil a arr3 . Si arr1 tiene un valor no en arr2 , se excluirá de arr3 . Estos son riesgos que deberá abordar de acuerdo con sus requisitos.

 - (NSArray*) sortedArray { NSArray *arr1 = @[@{@"id":@1},@{@"id":@2},@{@"id":@3},@{@"id":@4}]; NSArray *arr2 = @[@3,@1,@4,@2]; NSMutableArray *mutableArray = [NSMutableArray new]; for (NSNumber *number in arr2) { for (NSDictionary* dictionary in arr1) { NSNumber *number2 = dictionary[@"id"]; if ([number isEqual:number2]) { [mutableArray addObject:dictionary]; break; } } } return mutableArray; }