2011-05-03 26 views
0

我有NSDictinary对象数组。 每个字典对象都有键“display_name”,“first_name”和“last_name”。 有些字典对象只有display_name,有些则不会。 有些字典对象只有first_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]; 

可以将某些一个导向我以正确的方式实现它?

回答

2

你可以使用:

sortedArrayUsingFunction:背景:

并实现你只是在自己的自定义排序函数上市规则

+0

我知道不同的方法来实现它......但我无法构建如何做到这一点的确切逻辑。 – Satyam 2011-05-03 09:43:39

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]]; 
} 
相关问题