2014-01-30 2 views
2

У меня возникла проблема с созданием индекса из NSArray, содержащего множество NSDictionaries, где я хочу индексировать значения, основанные только на ключе username словаря. В качестве иллюстрации, каждый словарь выглядит примерно так:Создание индекса для UITableView на основе значений внутри NSArray из NSDictionaries

{ 
    username => "daspianist", //<- Only want to use this value to create index 
    objectId => "hjd72h3jd", 
    createdAt => "30-1-2014", 
    updatedAt => "30-1-2014" 
} 

На данный момент я упростил этот вопрос, так что я индексирование NSArray из NSStrings, и что я делаю следующее:

//Note that `stringArray` is passed to this method 
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    for (char firstChar = 'a'; firstChar <= 'z'; firstChar++) 
    { 
     NSString *firstCharacter = [NSString stringWithFormat:@"%c", firstChar]; 
     NSArray *content = [stringArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", firstCharacter]]; 
     NSMutableArray *mutableContent = [NSMutableArray arrayWithArray:content]; 

     if ([mutableContent count] > 0) 
     { 
      NSString *key = [firstCharacter uppercaseString]; 
      [dict setObject:mutableContent forKey:key]; 
      NSLog(@"%@: %u", key, [mutableContent count]); 
     } 
    } 

Я изо всех сил пытаюсь преобразовать то, что я делал для NSStrings, чтобы быть внутри значений для ключа username в моих NSDictionaries, и был бы признателен за любые указания. Благодаря!

Update

Чтобы уточнить, результирующая словарь, что я заинтересован в будет выглядеть примерно так

{ 
    "a" => { 
      username => "aardvark", 
      otherKeys => "otherValues" 
      }, 
      { 
      username => "applepicking", 
      otherKeys => "otherValues" 
      } 
    "d" => { 
      username => "daspianist", 
      otherKeys => "otherValues" 
      } 
     .... 
} 

Update 2

Решение напечатал базируется в Wain ' s для простоты использования:

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    for (char firstChar = 'a'; firstChar <= 'z'; firstChar++) 
    { 
     NSString *firstCharacter = [NSString stringWithFormat:@"%c", firstChar]; 
     NSArray *content = [userNamesArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", firstCharacter]]; 
     NSMutableArray *mutableContent = [NSMutableArray arrayWithArray:content]; 
     NSPredicate *p = [NSPredicate predicateWithFormat:@"username IN %@", content]; 

     if ([mutableContent count] > 0) 
     { 
      NSString *key = [firstCharacter uppercaseString]; 
      NSArray *values = [originalDictionary filteredArrayUsingPredicate:p]; 
      [dict setObject:values forKey:key]; 
      NSLog(@"%@: %lu", key, (unsigned long)[mutableContent count]); 
     } 
    } 

    NSLog(@"The dictionary is %@", dict); 
+0

Таким образом, конечный результат вы хотите это словарь. Ключами являются одиночные символьные строки, значения - это массивы словарей (имена пользователей, соответствующие одному символу)? – Wain

+0

@Wain Да, это правильно. Например, результирующий словарь будет иметь «ключ» как «А», а значения - «NSDictionaries», у которых «имя пользователя» начинается с «А». – daspianist

ответ

1

Таким образом, content - это массив username s, соответствующих текущему ключу. Цель состоит в том, чтобы найти все словари, содержащие username в этом массиве. Это работа для предиката:

NSPredicate *p = [NSPredicate predicateWithFormat:@"username IN %@", content]; 

теперь вы можете сделать:

NSArray *values = [dictArray filteredArrayUsingPredicate:p]; 
[dict setObject:values forKey:key]; 
+0

Спасибо! Отличный ответ с использованием 'NSPredicate'. – daspianist

1

Try реализовать следующую функцию:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 
{ 
    NSMutableArray *charactersForSort = [[NSMutableArray alloc] init]; 
    for (NSDictionary *item in array) 
    { 
     NSString *username = [item objectForKey:@"username"] 
     if (![charactersForSort containsObject:[username substringToIndex:1]]) 
     { 
      [charactersForSort addObject:[username substringToIndex:1]]; 
     } 
    } 

    return charactersForSort; 
} 

Здесь массив является NSArray словарей, которые вы упомянули в своем вопросе.

Смежные вопросы