Рядом с моим другим ответом в стиле C (еще раз спасибо, @Justin) я хочу постулировать другой ответ.
На этот раз я использую только синтаксис target-c и блоки.
Создание массива слов:
NSString *text = @"Lorem ipsum dolor sit amet,..."; // Lorem ipsum with non-letter words
NSArray *words = [[[text stringByReplacingOccurrencesOfString:@"." withString:@""]
stringByReplacingOccurrencesOfString:@"," withString:@""]
componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
создание и заполнение словаря:
NSMutableDictionary *wordDict = [NSMutableDictionary dictionary];
[words performBlock:^(id element) {
NSString *firstLetter = [[element substringToIndex:1] uppercaseString];
if ([firstLetter isGreaterThanOrEqualTo:@"A"] && [firstLetter isLessThanOrEqualTo:@"Z"]){
if (![[wordDict allKeys] containsObject:firstLetter]) {
NSMutableArray *array = [NSMutableArray array];
wordDict[firstLetter] = array;
}
[wordDict[firstLetter] addObject:element];
} else {
if (![[wordDict allKeys] containsObject:@"other"]) {
NSMutableArray *array = [NSMutableArray array];
wordDict[@"other"] = array;
}
[wordDict[@"other"] addObject:element];
}
}];
NSLog(@"%@",wordDict);
Обратите внимание, что этот код использует метод категории в NSArray performBlock:
. Этот метод не более чем применяет блок к каждому элементу в массиве. Его можно найти на github .
-(void)performBlock:(void (^)(id))block
{
for(id element in self) {
block(element);
}
}
выход
{
A = (
amet,
aliquyam,
At,
accusam,
amet,
amet,
aliquyam,
At,
accusam,
amet,
amet,
aliquyam,
At,
accusam,
amet
);
C = (
consetetur,
clita,
consetetur,
clita,
consetetur,
clita
);
//…
L = (
Lorem,
labore,
Lorem,
Lorem,
labore,
Lorem,
Lorem,
labore,
Lorem
);
//…
T = (
tempor,
takimata,
tempor,
takimata,
tempor,
takimata
);
U = (
ut,
ut,
ut
);
V = (
voluptua,
vero,
voluptua,
vero,
voluptua,
vero
);
other = (
"%$",
"!",
"9)7/",
1234,
56hfr
);
}