2012-06-24 14 views
8

Esto me está llevando por la pared y no puedo reconstruir cómo hacerlo.¿Ordenar números en NSArray?

Traigo mi matriz de un plist, esta matriz está llena de números (como se establece en la lista). Ahora todo lo que necesito hacer es ordenarlos para que estén descendiendo, pero no puedo resolverlo.

Espero que alguien pueda ayudar, gracias.

Respuesta

34

Pruebe este código?

NSArray *array = /* loaded from file */; 
array = [array sortedArrayUsingSelector: @selector(compare:)]; 
+0

Pero cuáles serían los contenidos del método de selección? Esto es lo que me atrapa. –

+0

¿Qué método de selector? –

+0

El método '-compare:' se define para las instancias 'NSNumber': https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html#// apple_ref/occ/instm/NSNumber/compare: –

11

A continuación se va a clasificar los números en orden ascendente y luego revertir el resultado con dar los números en orden descendente:

NSArray *sorted = [[[array sortedArrayUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects]; 

Esta pregunta anterior tiene algunas otras alternativas: Sort an NSArray in Descending Order

+0

Estoy recibiendo un bloqueo con '- [__ NSCFString sortedArrayUsingSelector:]: selector no reconocido enviado a instance'. –

+0

¿Estás seguro de que llamas a 'sortedArrayUsingSelector:' en un 'NSArray'? Parece que está llamando 'sortedArrayUsingSelector:' en un 'NSString'. Probablemente debería verificar la estructura de datos que se está cargando desde la Lista. – mttrb

+0

@Josh Kahane, si es así, es probable que tengas problemas con la gestión de la memoria, ya que tu puntero 'array' apunta al objeto' NSString'. ¿Olvidó retener/demasiadas publicaciones [automáticas]? – ivanzoid

4

Funciona para mí:

NSSortDescriptor *sortIdClient = 
[NSSortDescriptor sortDescriptorWithKey:@"campaignValue" 
           ascending:NO 
          comparator: ^(id obj1, id obj2){ 

    return [obj1 compare:obj2 options:NSNumericSearch]; 

}]; 

NSArray *sortDescriptors = @[sortIdClient]; 

NSArray *arrTemp = [self.allCampaignsList sortedArrayUsingDescriptors:sortDescriptors]; 
10

Este es uno de los muchos métodos que utilizan el bloque de comparación. Este fragmento de código es útil para cualquier matriz con números que desee ordenar. Por orden ascendente:

AscendingArray = [UnsortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
    }]; 

Por orden descendente:

DescendingArray = [UnsortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
    }]; 
+0

¿por qué no usar NSNumber 'compare:'? – vikingosegundo

0

esto va a resolver el problema:

NSArray *array = /* loaded from file */; 
array = [array sortedArrayUsingSelector: @selector(compare:)]; 
+0

por favor elimine la sangría adicional que hace que el texto se muestre como código – YakovL

Cuestiones relacionadas