2010-07-08 13 views
45

Sto provando a creare una tabella di punteggio elevato e succhiare gli array nell'obiettivo c (in realtà, in generale l'obiettivo c è difficile per me), quindi non riesco a capire come ordinare. Sto cercando di fare qualcosa di simile (speudocode, sto scrivendo questo in stile ActionScript perché sono più a suo agio con esso):Come si ordina una matrice NSMutable con NSNumbers al suo interno?

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

Ma io non riesco a capire ... I' Ho visto altri thread su di esso, ma il loro uso plist ha file e roba e non conosco abbastanza obiettivi da imparare da loro.

+0

È necessario leggere gli argomenti di programmazione NSPredicate e Predicate. Comprendere i predicati rende molte cose più facili in Obj-c ma non è qualcosa che la maggior parte delle risorse di addestramento iniziale passano in qualsiasi momento. – TechZen

+1

@TechZen, penso tu voglia dire NSSortDescriptior? – ohhorob

+0

Ah, sì. Il mio cervello insiste a trasporre NSSortDescriptior e NSPredicate circa la metà delle volte. Comunque il mio consiglio è stato valido anche se fuori tema. – TechZen

risposta

133

Vuoi fare che la strada più breve?

Se si dispone di una gamma di mutabile NSNumber casi:

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

Nizza e facile :)

È possibile anche effettuare una cernita simile con descrittori su array immutabili, ma si finirà con una copia , invece di ordinamento sul posto.

+11

+1 per il nome della variabile highestToLowest – cocoafan

+0

Nice and Easy baby;) – Abo3atef

+1

Per chiarimenti (e ottimizzazione): 'NSSortDescriptor * highestToLowest = [NSSortDescriptor sortDescriptorWithKey: @" self "ascendente: NO]; NSArray * sortedArray = [mutArray sortedArrayUsingDescriptors: @ [highestToLowest]]; ' – mylogon

26

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

dovrebbe funzionare se sono sicuramente tutti NSNumber s.

(Aggiunta di un oggetto è:

[highscores addObject:score];

)

Se si desidera ordinare discendente (più alto prima):

10,6/iOS 4:

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

    return NSOrderedSame; 
}]; 

Altrimenti è possibile definire un metodo di categoria, ad es .:

@interface NSNumber (CustomSorting) 

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

@end 

@implementation NSMutableArray (CustomSorting) 

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

@end 

e chiamarlo:

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

+0

Farò un tentativo, grazie. – meman32

+0

Ok, un problema minore, penso che questo sia risolto nel modo sbagliato ... Devono comunque cambiarlo? – meman32

+0

vuoi dire ascendente e discendente? – vodkhang

3

Ho provato la risposta fornita da ohhorob, ma gli oggetti erano ancora ordinati in ordine alfabetico. Poi ho trovato questo in un'altra risposta (https://stackoverflow.com/a/4550451/823356):

Ho cambiato il mio NSSortDescriptor e ora ordina numericamente.

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

Ho appena Ho pensato di questo qui come risolto il mio 'ordinamento alfabetico NSNumbers' problema

0

Questo codice ordinare un NSMutableArray di NSNumber in ordine crescente:

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

Questo codice ordinare un NSMutableArray di NSNumber in ordine decrescente:

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

Il codice utilizza il confronto tra NSNumber: il metodo restituisce un NSComparisonResult che va da -1 a 1.Moltiplicando il risultato del confronto per -1 si inverte il risultato e quindi si inverte l'ordinamento in ordine decrescente.

+0

oppure puoi cambiare '[obj1 compare: obj2]' con '[n2 compare: n1]' –

-1

Per Discendente ordine:

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

Per crescente Ordina

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

distanza è una chiave ed è collegamento valore (float o doppio)

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

Per tutti è vale la pena, ecco un altro metodo stenografico:

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); 
Problemi correlati