2013-04-05 17 views
7

NSDictionary dizilemeye çalışıyorum. Kullanabileceğin bkz Apple docs itibarenBir NSDictionary sıralama, azalan. Karşılaştırma seçenekleri: Seçenekler: seçiciyle nasıl gönderirim?

keysSortedByValueUsingSelector: vermektedir

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:)]; 

:

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

ama istiyorum:

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

Sana compare:options: kullanabileceği okudum ve comp değiştirmek için bir NSStringCompareOptions Diğer yönde karşılaştırmak için arison.

Ancak, seçicideki seçenekleriyle compare:options:nasıl yolladığınızı anlamıyorum.

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

nasıl karşılaştırma sıralamasını değiştirmek gerekir:

Böyle bir şey yapmak ister misin?

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

+0

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

cevap

4

kullandığım:

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

Bu cevap yanlıştır. Anahtar sözcükleri, söz dizisindeki değerlere bakılmaksızın, azalan sırada sıralar. @ noa'nın karşılaştırıcıyı kullanmak için verdiği cevap doğrudur. – Jon

13

Seçenek 1: kullanın karşılaştırma tersten -compare: çağırmak için: (Teşekkürler Dan Shelly)

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

Sadece azalan ve artan geri dönüş deyimlerini tersine çevirmek karınca.

2. Seçenek: sahip bir dizi ters:

bakınız How can I reverse a NSArray in Objective-C?

+0

veya [dict keysSortedByValueUsingComparator:^NSComparisonResult (id obj1, id obj2) { dönüş [obj2 karşılaştır: obj1]; }]; –

+0

Bu, diziyi tersine çeviremezdi, belki de 'geri dön - [objc2 karşılaştır: obj1]' çalışırdı. – paulmelnikow

+0

Ben basit bir örnek üzerinde test ettik ..., Karşılaştırma tabanlı bir sıralamada, daha spesifik olmak gerekirse, karşılaştırma sırasını tersine çeviren sonuç dizisini tersine çevirir –