2011-12-31 8 views
5

Tengo dos NSMutableArrays. El contenido de la primera es numéricamente, que está emparejado con el contenido de la segunda:Solicite dos NSMutableArrays basados ​​en uno

First Array Second Array 
    45    Test45 
    3    Test3 
    1    Test1 
    10    Test10 
    20    Test20 

Esa es la mirada de ambas matrices. Ahora, ¿cómo podría ordenarlos tan numéricamente para que terminen así:

First Array Second Array 
    1    Test1 
    3    Test3 
    10    Test10 
    20    Test20 
    45    Test45 

Thanks!

+2

Esto se conoce como "clasificación por índice". Curiosamente, no hay una rutina de biblioteca para hacer esto en Objective-C o en la mayoría de los otros entornos, a pesar de que el requisito aparece aquí con bastante frecuencia. Por lo tanto, el enfoque más simple es colocar las entradas en otro objeto (Elemento de primera matriz/Elemento de segunda matriz) y ordenar esos objetos, luego reconstruir sus matrices. De lo contrario, tendrías que escribir tu propia rutina de clasificación. –

+0

Lo siento, pero no lo entendí :(Esta es la primera vez que trato con la ordenación de matrices, así que no tengo ni idea :( – pmerino

Respuesta

17

Pondré las dos matrices en un diccionario como claves y valores. Luego puede ordenar la primera matriz (actuando como teclas en el diccionario) y acceder rápidamente a los valores del diccionario en el mismo orden. Tenga en cuenta que esto solo funcionará si los objetos en la primera matriz admiten NSCopying porque así es como funciona NSDictionary.

El siguiente código debería hacerlo. En realidad es bastante corto porque NSDictionary ofrece algunos buenos métodos de conveniencia.

// Put the two arrays into a dictionary as keys and values 
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:secondArray forKeys:firstArray]; 
// Sort the first array 
NSArray *sortedFirstArray = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)]; 
// Sort the second array based on the sorted first array 
NSArray *sortedSecondArray = [dictionary objectsForKeys:sortedFirstArray notFoundMarker:[NSNull null]]; 
+3

Muy buen código, pero no maneja el caso cuando las claves no son único. –

8

En lugar de mantener dos matrices paralelas, mantendría una única matriz de objetos modelo. Cada número del primer conjunto sería el valor de una propiedad, y cada cadena del segundo conjunto sería el valor de la otra propiedad. Luego puede ordenar en una o ambas propiedades usando sort descriptors.

Generalmente, en Cocoa y Cocoa Touch, las matrices paralelas funcionan mientras los objetos modelo guardan el trabajo. Prefiere lo último sobre lo primero siempre que puedas.

Cuestiones relacionadas