排序NSArray基于字典中的可用数据



我有nsdictionary对象数组。每个字典对象都有键"display_name"、"first_name"one_answers"last_name"。有些字典对象只有display_name,有些则没有。有些字典对象只有first_name,有些则没有。有些字典对象只有last_name,有些没有。

我使用这个数组在表视图中显示列表。我要找的是排序字典与以下偏好:1. 如果显示名称可用,使用它。2. 如果显示名不可用而名字可用,则使用它。3.

如何使用上述首选项对数组进行排序。我想使用nsprecate应用程序也必须在旧的iOS上工作....

我尝试了不同的NSPredicate组合如下,但我没有成功:

    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:背景:

并实现刚才在您自己的自定义排序函数
中列出的规则

我所做的是在排序过程中,我向字典"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]];
}

最新更新