我有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];
有人可以指导我以正确的方式实现它吗?
答案 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]];
}