2011-05-03 1 views
0

NSDictinary 개체 배열을 사용하고 있습니다. 각 사전 객체에는 "display_name", "first_name"및 "last_name"키가 있습니다. 일부 dict 개체에는 display_name 만 있고 일부 개체에는없는 개체가 있습니다. 일부 사전 개체는 first_name 만 있고 일부 개체는 갖지 않습니다. 일부 dict 개체에는 last_name 만 있고 일부 개체에는 없습니다.iPhone - 사전에서 사용 가능한 데이터를 기반으로 NSArray를 정렬합니다.

테이블보기로 목록을 표시하려면이 배열을 사용하고 있습니다. 내가 찾고있는 것은 선호도에 따라 사전을 정렬하는 것입니다 : 1. 표시 이름을 사용할 수 있으면 그것을 사용하십시오. 2. 표시 이름을 사용할 수없고 이름을 사용할 수 있으면이를 사용하십시오. 3. 다른 성.

어떻게 위의 기호를 사용하여 배열을 정렬 할 수 있습니까? 나는 다음과 같은 자 NSPredicate의 다른 조합을 시도

.... 응용 프로그램뿐만 아니라 이전의 iOS에서 작동하는 자 NSPredicate를 사용하려면,하지만 난 succeeed하지 않았다 :

NSSortDescriptor* firstNameDescriptor; 
    NSSortDescriptor* lastNameDescriptor; 
    NSSortDescriptor* displayNameDescriptor; 
    displayNameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"display_name" ascending:YES]; 
    lastNameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"last_name" ascending:YES];      
    firstNameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"first_name" ascending:YES]; 

    NSArray *sortDescriptors = [NSArray arrayWithObjects:firstNameDescriptor, lastNameDescriptor,nil]; 

    self.contactsArray = (NSMutableArray*)[tempArray sortedArrayUsingDescriptors:sortDescriptors]; 

수있는 하나의 가이드를 그것을 달성하기 위해 올바른 방법으로 나를?

sortedArrayUsingFunction : 문맥 :

답변

2

당신이 사용할 수있는

을하고 당신이 당신 자신의 사용자 정의 정렬 기능에 나열된 규칙을 구현

+0

나는 그것을 달성하는 여러 가지 방법을 알고 있지만 ... 나는 그것을하는 방법의 정확한 논리를 짜맞출 수 없다. – Satyam

0

내가 그랬어 정렬하는 동안, 나는 또 다른 키를 추가하는 것이 무엇 사전 "final_name"값은 표시 할 이름에 대한 내 선호도에 따라 설정되고 "final_name"으로 배열을 정렬합니다.

NSArray* tempArray = [jsonData objectForKey:@"contacts"]; 
    for (NSDictionary* conDict in tempArray) 
    { 
     NSString* fName = [conDict objectForKey:@"first_name"]; 
     NSString* lName = [conDict objectForKey:@"last_name"]; 
     NSString* dName = [conDict objectForKey:@"display_name"]; 

     NSString* finalName = @"<<No Name>>"; 

     if (dName && ![dName isEqual:[NSNull null]]) { 
      finalName = dName; 
     } 
     else if (fName && ![fName isEqual:[NSNull null]] && lName && ![lName isEqual:[NSNull null]]) 
     { 
      finalName = [NSString stringWithFormat:@"%@ %@",fName,lName]; 
     } 
     else if (fName && ![fName isEqual:[NSNull null]]) 
     { 
      finalName = fName; 
     } 
     else if (lName && ![lName isEqual:[NSNull null]]) { 
      finalName = lName; 
     } 
     [conDict setValue:finalName forKey:@"final_name"]; 
    } 

    if ([tempArray count]) 
    { 
     NSSortDescriptor* finalSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"final_name" ascending:YES]; 
     NSArray *sortDescriptors = [NSArray arrayWithObjects:finalSortDescriptor,nil]; 
     self.contactsArray = [[NSArray alloc] initWithArray:[tempArray sortedArrayUsingDescriptors:sortDescriptors]]; 
}