2013-04-05 13 views
7

Sto tentando di ordinare un NSDictionary.Ordinamento di un NSDictionary, discendente. Come posso inviare opzioni con il `compare: options:` selector?

Dal Apple docs vedo è possibile utilizzare keysSortedByValueUsingSelector:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithInt:63], @"Mathematics", 
    [NSNumber numberWithInt:72], @"English", 
    [NSNumber numberWithInt:55], @"History", 
    [NSNumber numberWithInt:49], @"Geography", 
    nil]; 

NSArray *sortedKeysArray = [dict keysSortedByValueUsingSelector:@selector(compare:)]; 

che dà:

// sortedKeysArray contains: Geography, History, Mathematics, English 

ma voglio:

// sortedKeysArray contains: English, Mathematics, History, Geography 

Ho letto che è possibile utilizzare compare:options: e un NSStringCompareOptions per modificare il comp arison da confrontare nella direzione opposta.

Tuttavia, non capisco come si invia compare:options:con un'opzione nel selettore.

voglio fare qualcosa di simile:

NSArray *sortedKeysArray = [dict keysSortedByValueUsingSelector:@selector(compare:options:NSOrderDescending)]; 

Come devo cambiare l'ordine del confronto?

correlati: https://discussions.apple.com/thread/3411089?start=0&tstart=0

+0

'NSArray * ascedingArray = [[sortedKeysArray reverseObjectEnumerator] allObjects];' –

risposta

4

io uso:

NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO]; 
    self. sortedKeys = [[self.keyedInventoryItems allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortOrder]]; 
+0

Questa risposta non è corretta. Ordina le chiavi in ​​ordine decrescente, senza riferimento ai valori nel dizionario. La risposta di @ Noa per usare il comparatore è corretta. – Jon

13

Opzione 1: Usare un comparatore per invocare -compare: in senso inverso: (! Grazie Dan Shelly)

NSArray *blockSortedKeys = [dict keysSortedByValueUsingComparator: ^(id obj1, id obj2) { 
    // Switching the order of the operands reverses the sort direction 
    return [objc2 compare:obj1]; 
}]; 

Proprio invertire le dichiarazioni di ritorno discendente e ascendente e dovresti ottenere ciò che vuoi formica.

Opzione 2: Invertire la matrice si ha:

Vedere How can I reverse a NSArray in Objective-C?

+0

o [dict keysSortedByValueUsingComparator:^NSComparisonResult (id obj1, id obj2) { return [obj2 compare: obj1]; }]; –

+0

Questo non invertirà l'array, anche se forse 'return - [objc2 compare: obj1]' funzionerebbe. – paulmelnikow

+0

L'ho provato su un semplice esempio ..., per essere più specifici, in un ordinamento basato sul confronto, invertendo l'ordine di confronto si invertirà l'array risultante –

Problemi correlati