iPhone - сортировка NSArray по доступным данным в словаре - PullRequest
0 голосов
/ 03 мая 2011

У меня есть массив NSDictinary объектов.Каждый объект словаря имеет ключи «display_name», «first_name» и «last_name».Некоторые объекты dict имеют только display_name, а некоторые - нет.Некоторые объекты dict имеют только first_name, а некоторые - нет.У некоторых объектов dict есть только last_name, а у некоторых нет.

Я использую этот массив для отображения списка в табличном представлении.То, что я ищу, - это отсортировать диктовку со следующими предпочтениями: 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 ]

2 голосов
/ 03 мая 2011

вы можете использовать:

sortedArrayUsingFunction: контекст:

и реализуйте правила, которые вы только что перечислили, в своей собственной функции сортировки

0 голосов
/ 03 мая 2011

Что я сделал, так это то, что во время сортировки я добавил еще один ключ в словарь "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]];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...