2009-08-19 25 views
1

私の現在のiPhoneプロジェクトでは、サブ辞書を「名前」キーの最初の文字でグループ化した辞書を作成しました。 NSLogは以下を返します。最初の文字キーの下に「名前」キーしか表示されていない同じ辞書を作成したいと思います。サブディクショナリ内のいくつかのアイテムのコピーを作成する最善の方法は何ですか? ObjectForKeyメソッドは、最初の文字(例: "B"または "C")の項目のみを選択します。私がこれを明確に説明していないかどうか教えてください。 ありがとう!複数のサブ辞書を含む辞書をコピーし、サブ辞書から特定のキーのみを返す

sectionedDictionaryByFirstLetter:{ 
B =  (
      { 
     Name = "B...A Name Starting with B"; 
     Image = "ImageName1.png"; 
     Text = "Some Text"; 
    } 
); 
C =  (
      { 
     Name = "C...A Name Starting with C"; 
     Image = "ImageName2.png"; 
     Text = "Some Text"; 
    } 
); 
N =  (
      { 
     Name = "N...A Name Starting with N"; 
     Image = "ImageName3.png"; 
     Text = "Some Text"; 

    }, 
      { 
     Name = "N...A Name Starting with N"; 
     Image = "ImageName4.png"; 
     Text = "Some Text"; 

    }, 
      { 
     Name = "N...A Name Starting with N"; 
     Image = "ImageName5.png"; 
     Text = "Some Text"; 

    } 
    ); 
} 

私が探している最終的な結果は次のとおりです。

sectionedDictionaryByFirstLetter:{ 
B =  (
      { 
     Name = "B...A Name Starting with B"; 
    } 
); 
C =  (
      { 
     Name = "C...A Name Starting with C"; 
    } 
); 
N =  (
      { 
     Name = "N...A Name Starting with N"; 
    }, 
      { 
     Name = "N...A Name Starting with N"; 
    }, 
      { 
     Name = "N...A Name Starting with N"; 
    } 
    ); 
} 

答えて

1
NSMutableDictionary* newDict = [NSMutableDictionary dictionary]; 
for (NSString* key in sectionedDictionaryByFirstLetter) { 
    NSMutableArray* newList = [NSMutableArray array]; 
    [newDict setObject:newList forKey:key]; 
    for (NSDictionary* entry in [sectionedDictionaryByFirstLetter objectForKey:key]) { 
     NSString* name = [entry objectForKey:@"Name"]; 
     [newList addObject:[NSDictionray dictionaryWithObject:name forKey:@"Name"]]; 
    } 
} 
+0

私はいつもキー列挙子は無駄だと思っていました。これは、一般的には、キーを反復し、後で各値を「検索」操作として取得することを意味します。 –

+0

助けてくれてありがとう。私は小さなタイプミスを見つけました:objectWithKeyはobjectForKeyでなければなりません。 また、配列はどこにnewDictに追加されますか? ありがとう! – Jonah

+0

これは、私がそれを動作させるために終わったものです: NSString * name = [entry objectForKey:@ "Name"]; [newList addObject:[NSDictionary dictionaryWithObject:name forKey:@ "Name"]]; NSString * afirstLetterString = [name substringToIndex:1]; [newDict setObject:newList forKey:afirstLetterString]; – Jonah

2

Core Foundationのは素晴らしい機能、CFDictionaryApplyFunctionを(私は彼らがあまりにもNSDictionaryにその機能を移植したい)があります。ただし、NSDictionaryCFDictionaryはフリーダイヤルのブリッジで、無料でそれらの間をキャストすることができます。

したがって、上記のCFDictionaryApplyFunctionで使用されるアプライアー機能SaveNameを作成することです。例:

void SaveName(const void* key, const void* value, void* context) { 
    NSMutableDictionary* result = (NSMutableDictionary*) context; 
    NSDictionary* dataDict = (NSDictionary*) value; 
    NSString* letterKey = (NSString*) key; 
    [result setObject:[dataDict valueForKey:@"Name"] forKey:@letterKey]; 
} 

void main() { 

    NSDictionary* exampleDict = .. ; 
    NSMutableDictionary* resultDict = [NSMutableDictionary dictionary]; 
    CFDictionaryApplyFunction((CFDictionaryRef)exampleDict, SaveName, (void*)resultDict); 
    // now, the resultDict contains key-value pairs of letter-name! 
} 

私のコードは、「値」辞書で唯一のオブジェクトが存在することを前提としています。あなた自身のデータ構造を考慮に入れてSaveNameを変更することはできますが、基本的にそれを行う方法です。

+0

アレイはどこにありますか? –

+0

@ニコライ:私は、オブジェクトが1つしかないと仮定し、他のデータ構造もサポートするように変更することができると言った。 また、あなたの答えで、後で "newDict"に配列を追加するのを忘れた... –

関連する問題