2010-07-08 14 views
45

Estoy tratando de hacer una tabla de puntaje alto, y chupar en las matrices en el objetivo c (en realidad, en general, el objetivo c es un reto para mí), por lo que no puedo encontrar la manera de ordenar. Estoy tratando de hacer algo como esto (speudocode, estoy escribiendo esto en el estilo de ActionScript porque estoy más cómodo con él):¿Cómo puedo ordenar una matriz NSMutable con NSNumbers en ella?

highscores.addObjecttoArray(score) 
highscores.sort(ascending) 

Pero no puedo averiguarlo ... I' he visto otros hilos al respecto, pero su uso plist archivos y esas cosas, y no sé suficiente objetivo c para aprender de ellos.

+0

Debería leer acerca de los temas de NSPredicate y Predicate Programming. Comprender los predicados hace que muchas cosas sean más fáciles en Obj-c, pero no es algo que la mayoría de los recursos de capacitación inicial pasan en cualquier momento. – TechZen

+1

@TechZen, creo que te refieres a NSSortDescriptior? – ohhorob

+0

Ah, sí. Mi cerebro insiste en transponer NSSortDescriptior y NSPredicar la mitad del tiempo. Aún así mi consejo fue bueno si no estaba relacionado con el tema. – TechZen

Respuesta

133

¿Le gustaría hacer que la forma corta?

Si tiene una matriz mutable de NSNumber casos:

NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO]; 
[mutableArrayOfNumbers sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]]; 

agradable y fácil :)

También puede realizar la clasificación similar con los descriptores de las matrices de inmutables, pero el resultado final será con una copia , en lugar de ordenar en el lugar.

+11

+1 para el nombre de la variable highestToLowest – cocoafan

+0

Nice and Easy baby;) – Abo3atef

+1

Para aclaración (y optimización): 'NSSortDescriptor * highestToLowest = [NSSortDescriptor sortDescriptorWithKey: @" self "ascendente: NO]; NSArray * sortedArray = [mutArray sortedArrayUsingDescriptors: @ [highestToLowest]]; ' – mylogon

26

[highscores sortUsingSelector:@selector(compare:)];

debería funcionar si son definitivamente todos NSNumber s.

(Adición de un objeto es:

[highscores addObject:score];

)

Si desea ordenar descendente (más alto primero):

10.6/IOS 4:

[highscores sortUsingComparator:^(id obj1, id obj2) { 
    if (obj1 > obj2) 
     return NSOrderedAscending; 
    else if (obj1 < obj2) 
     return NSOrderedDescending; 

    return NSOrderedSame; 
}]; 

De lo contrario, puede definir un método de categoría, por ejemplo:

@interface NSNumber (CustomSorting) 

- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber; 

@end 

@implementation NSMutableArray (CustomSorting) 

- (NSComparisonResult)reverseCompare:(NSNumber *)otherNumber { 
    return [otherNumber compare:self]; 
} 

@end 

y llamarlo:

[highscores sortUsingSelector:@selector(reverseCompare:)];

+0

Voy a probar esto, gracias. – meman32

+0

Ok, problema menor, creo que eso es ordenarlo de la manera incorrecta ... ¿Es de todos modos para cambiar eso? – meman32

+0

¿Quiere decir ascendente y descendente? – vodkhang

3

Probé la respuesta provista por ohhorob, pero los objetos todavía se ordenaban alfabéticamente. Luego me encontré con esto en otra respuesta (https://stackoverflow.com/a/4550451/823356):

Cambié mi NSSortDescriptor y ahora ordena numéricamente.

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score" 
               ascending:YES 
               comparator:^(id obj1, id obj2) { 
    return [obj1 compare:obj2 options:NSNumericSearch]; 
}]; 

Yo sólo pensé en dejar esto aquí ya que resolvió mi 'clasificación alfabética de NSNumbers' problema

0

Este código ordenar un NSMutableArray de NSNumber en orden ascendente:

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2]; 
}]; 

Este código ordenar un NSMutableArray de NSNumber en orden descendente:

[tempRA sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2] * -1; // reverse the enum 
}]; 

El código utiliza el hecho de que el método NSNumber compare: devuelve un NSComparisonResult que va de -1 a 1.Al multiplicar el resultado de la comparación por -1 se invierte el resultado y, por lo tanto, se invierte el orden al orden descendente.

+0

o puede cambiar '[obj1 compare: obj2]' con '[n2 compare: n1]' –

-1

Para descendente Orden:

NSArray *DescendingArray = [MinMaxArray sortedArrayUsingDescriptors: 
           @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" 
                   ascending:NO]]]; 

Por orden ascendente

NSArray *AscendingArray = [MinMaxArray sortedArrayUsingDescriptors: 
           @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" 
                   ascending:YES]]]; 
1

distancia es una clave y es enlace de valor (float o double)

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"distance" 
ascending:YES 
comparator:^(id obj1, id obj2) 
        { 
        return [obj1 compare:obj2 options:NSNumericSearch]; 
        }]; 
NSArray *myArray = [NSArray arrayWithArray:arraySubCat]; 
myArray=[myArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,nil]]; 
arraySubCat = [myArray copy]; 
1

Para todos es vale la pena, aquí hay otro método abreviado:

NSArray* n = @[@8, @3, @1, @12, @16, @7, @0, @5]; 

NSArray* asc = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) { 
      return [n1 compare:n2]; 
     }]; 
NSLog(@"Ascending: %@", asc); 

NSArray* dec = [n sortedArrayUsingComparator:^NSComparisonResult(NSNumber* n1, NSNumber* n2) { 
      return [n2 compare:n1]; 
     }]; 
NSLog(@"Descending: %@", dec); 
Cuestiones relacionadas