2010-11-19 24 views
4

Bir NSDictionary dizilemenin doğru yolu, anahtarlardan bir dizi oluşturmak, diziyi sıralamak ve diziyle numaralandırmak ve oradan NSDictionary üzerinde çalışmaktır.NSDictionary neden bellekte alfabetik, ancak numaralandırmada değil?

NSLog(@"%@", dict); 

Ama bu değildir: Sorum

Bu neden alfabetik olduğunu, anahtarlar ve dizeleri değerleriyle, bir NSDictionary * dict için vardır

for (NSString *w in dict) 
{ 
    NSLog(@"%@", w); 
} 

garip görünüyor ... Yanlış bir şey mi yapıyorum?

Şimdiden teşekkürler.

cevap

6

Bu, "bellekte" değil -% @, dict üzerinde çağrılacak bir ileti neden oluyor ve bunu sıralıyor. Numaralandırma, size içeriğe en hızlı ve ham erişimi vermektir. İhtiyacın varsa, onu sıralamanız gerekir. İlki tarif tam şekilde diziyi sıralar Çünkü

için bu ücretsiz sıralanmış sözlüğe bir göz atın Objective-C

http://code.google.com/p/cocoa-sorted-dictionary/

+0

Ah, bu mantıklı. NSLog'un% @ sıralamalarını düşünmedim. Teşekkürler! – iBuys

+0

I.e. diktatörler doğası gereği sıralanmamıştır. – bbum

+0

Sözlük, yalnızca bir değeri diğerine eşleyen bir koleksiyon için bir arabirimdir. Sıralanmamış olması gerekmiyor. Örneğin, bir ikili ağaçtan bir sözlük yapabilirdim - bu durumda sipariş verilebilirdi. C++ 'da std :: map'in bir sözlük arayüzü vardır ve sipariş edilir. Bir Hash tablosu sırasızdır, bu yüzden birinden yapılmış bir sözlük de olurdu. –

2

, daha kolay kullanıcı/programcı bulmak için yapmak şey. Ancak, alt düzey CFCopyDescription(dict)'u kullanırsanız yineleme sırasını alırsınız.

CoreFoundation koleksiyonları için kaynak kodu da olsa Objective-C arabirimi olmadan, available olduğunu. NSDictionary/CFDictionary ve NSSet/CFSet, bir tesh tablosunu şaşırtıcı bir şekilde uygulayan CFBasicHash dayanmaktadır. CFCopyDescription() ve bellek sırasındaki öğeler üzerinde hızlı yineleme döngüsü (CFBasicHash.m içinde CFBasicHashApply() ve CFBasicHashGetBucket()). Gerçek sipariş, hashta dayalı hızlı arama için tasarlanmıştır. Karma tablolar ile aşina değilseniz, bkz. Wikipedia.

+0

Bu iyi bir açıklamadır, ayrıntılı bilgi için teşekkür ederiz. – iBuys

İlgili konular