iPhone - 根据字典中的可用数据对NSArray进行排序

时间:2011-05-03 07:45:04

标签: iphone sorting nsarray

我有NSDictinary对象数组。 每个字典对象都有键“display_name”,“first_name”和“last_name”。 有些dict对象只有display_name,有些不会有。 有些dict对象只有first_name而有些对象没有。 有些dict对象只有last_name,有些不会有。

我正在使用此数组在表视图中显示列表。我正在寻找的是按以下偏好对dict进行排序: 1.如果显示名称可用,请使用它。 2.如果显示名称不可用且名字可用,请使用该名称。 3.其他姓氏。

如何使用上述首选项对数组进行排序。我想使用NSPredicate应用程序也可以在旧的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];

有人可以指导我以正确的方式实现它吗?

2 个答案:

答案 0 :(得分:2)

你可以使用:

sortedArrayUsingFunction:上下文:

并实施您在自己的自定义排序功能中列出的规则

答案 1 :(得分: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]];
}