В ответе Джозефа Туры есть ряд вопросов, которые он не проверял, как он упоминал. Вот вопросы:
1) [aPerson.name substringWithRange: aRange] завершится сбоем, если имя равно nil или @ "";
2) Если firstLetter уже находится в списке ключей, текущий массив не сбрасывается, чтобы указывать на объект массива, который принадлежит ключу firstLetter. Таким образом, если currentArray ранее указывал на массив, ключ которого в словаре - «K», и все же текущий firstLetter, являющийся «P», уже существует в качестве ключа, будет добавлено имя (которое начинается с этой буквы «P») в массив имен, начинающихся с «к». Большая проблема там.
3) Jassie добавляется в другой массив к jassie в результате различия в регистре (прописные и строчные буквы 'k' обрабатываются по-разному).
Итак, в качестве огромного улучшения ответа Джозефа, поскольку пункт № 2 имеет решающее значение, ниже приведена более точная реализация для будущих пользователей:
-(NSDictionary*)indexArrayByName:(NSArray*)people
{
NSMutableDictionary *anIndexedDict = [[NSMutableDictionary alloc] init];
NSMutableArray *currentArray = nil;
NSRange aRange = NSMakeRange(0, 1);
NSString *firstLetter;
for(Person *aPerson in people)
{
if(aPerson.name.length)
firstLetter = [[aPerson.name substringWithRange:aRange] uppercaseString];
else
firstLetter = @"noName";//find own way to identify these
if(![anIndexedDict.allKeys containsObject:firstLetter])
{
currentArray = [NSMutableArray array];
anIndexedDict[firstLetter] = currentArray;
}
currentArray = anIndexedDict[firstLetter];
[currentArray addObject:aPerson];
}
return anIndexedDict;
}
Могут быть добавлены другие улучшения, например, удаление ведущих пробелов и т. Д., Но я просто подумал, что упомяну основные проблемы. Я проверил ответ Джозефа на эти проблемы, а затем мой, чтобы убедиться, что они устранены :). Кредитуйте Джозефа за основную идею. Приветствия.