2009-10-25 13 views
17

Memorizzo i nomi come chiavi e valori come valori in un NSDictionary per il salvataggio in NSUserDefaults. Poi voglio recuperare le chiavi in ​​ordine di punteggio, ma non riesco a ordinarle numericamente, solo per stringa. L'elenco dei punteggi 100, 50, 300, 200, 500, ad esempio, mi dà 100, 200, 300, 50, 500.Tasti NSDictionary ordinati per valore numerico

Questo può essere fatto o devo fare diversamente?

NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
NSNumber *defaultScores[] = {@"600", @"500",@"100",@"50", nil}; 

NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:(id *)defaultScores forKeys:(id *)defaultNames count:7]; 

NSArray *currScores = [scoreDict keysSortedByValueUsingSelector:@selector(compare:)]; 
+3

stringhe Perché stai mettendo nel vostro array di puntatori NSNumber? –

+0

questa è una domanda eccellente ... hehe, devo aver perso quello – Matt

+1

Perché dici che ci sono 7 oggetti negli array quando ce ne sono davvero 4? –

risposta

2

-compare: è una stringa di confronto. Passare un metodo diverso per il confronto, per esempio:

@implementation NSString (numericComparison) 

- (NSComparisonResult) compareNumerically:(NSString *) other 
{ 
float myValue = [self floatValue]; 
float otherValue = [other floatValue]; 
if (myValue == otherValue) return NSOrderedSame; 
return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

@end 

Nel vostro caso specifico, è possibile utilizzare invece -intValue.

+0

Provare a scrivere un codice simile a questo, ma non prendere una NSString, ma prendere un int.Cosa fa [auto floatValue]; indicare? – prince

0

Non sono sicuro che sarebbe d'aiuto, ma puoi anche salvare un NSArray in un plist; A differenza di un NSDictionary (che restituisce chiavi in ​​ordine essenzialmente casuale), che li ottenete indietro come li metti in.

7

come sull'utilizzo keysSortedByValueUsingSelector (NSDictionary)

sembra essere quello che avete bisogno come per la documentazione in XCode

+0

disponibile solo per 10.6+ – hmak

+2

@hmak: No. Devi aver pensato a 'keysSortedByValueUsingComparator:' Il post menziona 'keysSortedByValueUsingSelector:', che è disponibile dal 10.0 – user102008

+1

Devo dire che la domanda è per iOS e non per MacOS? –

3
@implementation NSString (numericComparison) 

- (NSComparisonResult) floatCompare:(NSString *) other 
{ 
    float myValue = [self floatValue]; 
    float otherValue = [other floatValue]; 
    if (myValue == otherValue) return NSOrderedSame; 
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

- (NSComparisonResult) intCompare:(NSString *) other 
{ 
    int myValue = [self intValue]; 
    int otherValue = [other intValue]; 
    if (myValue == otherValue) return NSOrderedSame; 
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

@end 

NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
// NSNumber *defaultScores[] = {@"600", @"500",@"100",@"50", nil}; 

NSNumber *defaultScores[] = {                 
      [NSNumber numberWithInt:600], 
      [NSNumber numberWithInt:500], 
      [NSNumber numberWithInt:100], 
      [NSNumber numberWithInt:50], 
      nil 
    }; 

NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:(id *)defaultScores forKeys:(id *)defaultNames count:4]; 

NSArray *currScores = [newScoreDict keysSortedByValueUsingSelector:@selector(intCompare:NotSureWhatGoesHere:)]; 

Sono ancora confuso con la riga precedente?

Posso solo usare

// 
NSArray *currScores = [newScoreDict keysSortedByValueUsingSelector:@selector(intCompare:other:)]; 
// 

è l'array di numeri OK, o c'è un modo più semplice?

Grazie mille ...

+0

Perché stai usando float invece di double? – gnasher729

5
NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
NSNumber *defaultScores[] = {@"600", @"500",@"100",@"50", nil}; 
NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:(id *)defaultScores forKeys:(id *)defaultNames count:7]; 
NSArray *currScores = [scoreDict keysSortedByValueUsingSelector:@selector(localizedStandardCompare:)]; 
+0

Non riuscivo a farlo funzionare poiché i miei valori erano NSNumbers. Ma ho usato questo comparatore e ha funzionato: https://stackoverflow.com/a/9708772/2057171 –

0

Penso modo più semplice di questa domanda sta usando comparatore ..

NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
NSNumber *defaultScores[] = {@(600), @(500),@(400),@(50), nil}; 
NSDictionary *newScoreDict = [NSDictionary dictionaryWithObjects:defaultNames  forKeys:defaultScores count:4]; 
NSArray *currScores = [newScoreDict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return NSOrderedAscending; 
    }else{ 
     return NSOrderedDescending; 
    }}]; 

for (NSString *string in currScores) { 
    NSLog(@"%@",string); 
} 

provare questo .. ho notato che non potevo valore di portata con usando l'oggetto NSNumber così se si vuole raggiungere il valore dell'oggetto di quanto ho risolto con la modifica dei punteggi NSNumber su NSString e convertirli in numeri durante l'ordinazione. È possibile utilizzare come qui di seguito ..

NSString *defaultNames[] = {@"Matt", @"Terry",@"Jessica",@"Sean",nil}; 
NSString *defaultScores[] = {@"600", @"500",@"400",@"50", nil}; 
NSMutableDictionary *newScoreDict = [NSMutableDictionary dictionaryWithObjects:defaultScores forKeys:defaultNames count:4]; 

NSArray *currScores = [newScoreDict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSNumber *number1 = [formatter numberFromString:obj1]; 
NSNumber *number2 = [formatter numberFromString:obj2]; 
    if (number1.intValue > number2.intValue) { 
     return NSOrderedDescending; 
    }else{ 
     return NSOrderedAscending; 
    }}]; 

for (NSString *name in currScores) { 
    NSLog(@"key %@ value %@",name,[newScoreDict valueForKey:name]); 
} 

Speranza che aiuta ..

Problemi correlati