2012-07-04 4 views
0

I가 NSDictionary dic1 개체를 포함하는 가변 배열을 가지고있는 키는 NSDictionary 작성여러 값

각 사전 contactId 호출 키, 하나 이상의 사전 contactId 대해 동일한 값을 가질 수있다. 내가 원하는 무엇

는 키와 키와 동일한 값 contactId있는 모든 NSDictionary dic1 개체의 목록을 포함하는 배열 값으로 contactIds 독특한과 NSDictionary를 만드는 것입니다.

어떻게하면됩니까?

내 데이터는 다음과 같습니다

**myArray**:[ **dic1** {contactId = x1 , name = name1 }, **dic2**{contactId = x2, name = 
name2 }, **dic3**{contactId = x1, name = name3} ] 

나는 그것을 같이되고 싶어 :

**NSDictionary**: { **x1**:[dic1, dic3], **x2**:[dic2] } 
+0

만 값으로 사전을 가질 수 없습니다. 그것은 둘 다 가질 필요가 있으며, 그렇게 보이고 그에 따라 행동하도록 설계된 데이터 구조 유형입니다. – ant

+0

@ant 당신이 내 질문에 대해 오해 한 것 같아요 – ahmad

답변

3

를 사용하여 빠른 열거 :

NSMutableDictionary *result = [NSMutableDictionary dictionary]; 

for (id obj in myArray) 
{ 
    NSString *contactId = [obj objectForKey:@"contactId"]; 
    NSMutableSet *contacts = [result objectForKey:contactId]; 
    if (!contacts) 
    { 
     contacts = [NSMutableSet set] 
     [result setObject:contacts forKey:contactId]; 
    } 
    [contacts addObject:obj]; 
} 

당신은 진짜 추가 이익을 위해 블록을 사용할 수

__block NSMutableDictionary *result = [NSMutableDictionary dictionary]; 

[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){ 
    NSString *contactId = [obj objectForKey:@"contactId"]; 
    NSMutableSet *contacts = [result objectForKey:contactId]; 
    if (!contacts) 
    { 
     contacts = [NSMutableSet set] 
     [result setObject:contacts forKey:contactId]; 
    } 
    [contacts addObject:obj]; 
}]; 
+0

깔끔한 코딩! thnx @dreamlax – ahmad

0

방법은 고전적인 방식에 대해?

NSMutableDictionary* Result; 
NSEnumerator* Enumerator; 
NSDictionary* Dict; 
Result=[[NSMutableDictionary alloc] init]; 
Enumerator=[YourArray objectEnumerator]; 
while ((Dict=[Enumerator nextObject])!=nil) 
{ 
    NSString* ContactID; 
    NSMutableSet* Contacts; 
    ContactID=[Dict objectForKey:@"contactID"]; 
    Contacts=[Result objectForKey:ContactID]; 
    if (Contacts==nil) 
    { 
     Contacts=[[NSMutableSet alloc] init]; 
     [Result setObject:Contacts forKey:ContactID]; 
     [Contacts release]; 
    } 
    [Contacts addObject:Dict]; 
} 

결과 사전을 만들어야합니다. 나는 이것을 테스트하지 않았다 (또는 심지어 컴파일).

+3

코딩 규칙에 따라 'lowerCamelCase'를 사용하여 변수의 이름을 지정하십시오. – dreamlax

+0

죄송합니다. 실제로 stackoverflow 코딩 규칙을 기대하지 않았으므로 절대로 찾지 않았습니다. :-(( –

+0

@ChristianStieber - Microsoft의 경우를 제외하고 C 코드 작성자가 사용하는 표준 C 규칙입니다. –