2009-06-19 12 views
6

NSDictionary, anahtar/değer çiftleri için iyi, üç veriye sahip olduğunuzda en iyi hangi veri yapısına sahiptir? Bu 3 değer için bir sınıf oluşturmak en iyisidir ve sonra bir dizideki her nesnenin o sınıfın örneklerini içermesine izin verilsin mi? NSDictionary eşleştirilmiş değerler için iyi ise, üçlü değerler için iyi olan nedir?

spesifik olmak gerekirse: veri yapısı, en Kişi diyelim, ben üç değerlere sahiptir öngörmekteyiz: (NSString) adını IsAlive, (int) yaş, (BOOL)

Bunlar (dizide yapılacağı

?). Her ikisini de bir anahtar olarak kullanabilmek ve aynı zamanda sıfırdan başlayarak tüm bloğa bir sayı ile başvurmak önemlidir.

+1

Bu yeni yapıda 2 anahtar ve 1 değer veya 1 anahtar ve 2 değer var mı? Ya da değiştirilebilir? – samoz

+0

Soruyu daha ayrıntılı bir şekilde açıklamanız gerektiğini düşünüyorum. – U62

+1

Evet, NSDictionary anahtar/değer çiftlerini depolar, ancak bu gerçekten önemli değil. Çiftler simetrik değildir, NSDictionary'ın tüm * noktalarının, değerlerin olması gerekmedikçe anahtarların benzersiz olduğunu göz önünde bulundurmadan sadece "üçlü" ye genelleştiremezsiniz. Yani, üç elementten hangisinin "üçlü" olduğu ve anahtar-benzeri olan "üçlüler" inizde? – bendin

cevap

9

tek tuşa ve iki değeri varsa, muhtemelen iki değer için bir sınıf oluşturmak ve hala bir sözlük kullanmak. , anahtar ilk anahtar ve değer başka bir sözlük olan bir sözlük - Eğer iki anahtar ve bir değeri varsa

, muhtemelen iç içe bir sözlüğü kullanmak. İç içe geçmiş sözlük için anahtar ikinci anahtar olacaktır ve değer gerçek değeriniz olacaktır.

ETA: Artık sorunuzu açıklık ettik

- anahtar ya tamsayı endeksi hem koleksiyonunuzu erişmek gerekiyorsa, yine bir sözlük kullanabilirsiniz.

anahtar ile bir öğeyi almak için, bu yapardın:

[myDict objectForKey:@"joe"]; 

endeksi bir öğeyi almak için, AllKeys dizi kullanabilirsiniz:

[myDict objectForKey:[[myDict allKeys] objectAtIndex:1]]; 

Eğer almak için tek amacı Dizine göre insanlar tüm koleksiyonun üzerinden geçiyorsa, bir döngüdeki anahtarları sıralamak için keyEnumerator yöntemini kullanmaktan daha iyi olursunuz ve değerleri aramak için bu tuşları kullanın.

-1

bir two dimensional dizinin bu tarife değil midir?

+0

Her öğenin 3 öğeli bir diziye bağlandığı bir dizi düşünürsünüz. Bununla birlikte, iki boyutlu bir dizinin anahtar-değer çiftlerini depolamakla bir alakası yoktur - bu, bir sözlük gerektirir, bir "harita", "ilişkisel dizi", "karma", vs. olarak da görebileceğiniz bir şey. Özellikle, NSDictionary 1 anahtar çiftleri 1 değerine destekler - 3 değere 1 anahtar arıyor. –

0

Bir çeşit genel veri yapısı oluşturmaya veya yapmaya çalışmamaya bağlıdır. Eğer 'üç' şey sizin uygulamanızdaki belirli kavramlar ise o zaman bir domain model yönüne doğru ilerliyor olabilirsiniz - bu durumda, bu değerleri bir sınıfta kapsüllemek akıllıca olabilir. [NSDictionary objectForKey:] - Eğer işlevselliği gibi sözlüğünü gerektiriyorsa

vb - o zaman hala sınıf örneklerine anahtarı değerlerini map endeksler gibi bir veya daha fazla sözlüğünü kullanabilir.

1

Bir ilişkisel veritabanı modeli kullanılarak, daha karmaşık veri ilişkilerini temsil etmek çekirdek verilerini kullanabilirsiniz.

Apple'ın geliştirici sitesine örnekler ve belgeler için göz atın. (Bunu saklamak varsa) ve nesne için bir sınıf tanımlayan

0

Sen CoreData içine bakmak gerekir. NSDictionary gibi doğal genel nesneler, bir Kişi gibi karmaşık nesneleri oluşturan karmaşık değerleri depolamak için kullanılmaz.

Person *person = [[Person alloc] init]; 
person.firstName = @"blah"; 
person.age = 24; 
person.isAlive = YES; 
1

İlk başta ilgisiz gibi görünebilir, ama bu Introduction to Cocoa Bindings yılında sözlüğü odaklı bir yapıya göz atın. (CocoaDevCentral ve Scott Stevenson, yeni Kakao geliştiricileri için mükemmel kaynaklardır.) Kullandığı yaklaşım son derece esnek ve yolun aşağısında değişiyor.Ivar'lar yerine bir sözlük kullanmak her zaman en iyi çözüm değildir, ancak ihtiyaçlarınız için uygun olabilir.

Not: Çekirdek Veriler gibi Kakao Bağlamaları da çok karmaşık bir konudur. Öğreticinin yalnızca organizasyonel yönünü kullanmayı öneriyorum, ciltleme ile tümüyle çıkmama. :-)

İlgili konular