Я использовал NSSet
, чтобы за один раз добавить только одну копию слова.Это добавит слово, если NSSet
еще не содержит его.Затем он проверяет, является ли новое слово подстрокой для любого слова, которое уже было добавлено; если true, то новое слово не будет добавлено.Он также не учитывает регистр.
То, что я написал, это рефакторинг вашего кода.Возможно, это не намного быстрее, но вам действительно нужна древовидная структура данных, если вы хотите сделать ее намного быстрее, если вы хотите искать слова, которые уже были добавлены в ваше дерево.
Взгляните на RedBlack Trees или B-Trees .
Words.txt
objective
objectively
cappucin
cappucino
cappucine
programme
programmer
programmatic
programmatically
Исходный код
- (void)addRootWords {
NSString *textFile = [[NSBundle mainBundle] pathForResource:@"words" ofType:@"txt"];
NSString *string = [NSString stringWithContentsOfFile:textFile encoding:NSUTF8StringEncoding error:NULL];
NSArray *wordFile = [string componentsSeparatedByString:@"\n"];
NSMutableSet *goodWords = [[NSMutableSet alloc] init];
for (NSString *newWord in wordFile)
{
NSLog(@"Word: %@", newWord);
if ([newWord length] > 8)
{
NSLog(@"Word '%@' contains 8 or more characters", newWord);
BOOL shouldAddWord = NO;
if ( [goodWords containsObject:newWord] == NO) {
shouldAddWord = YES;
}
for (NSString *existingWord in goodWords)
{
NSRange textRange = [[newWord lowercaseString] rangeOfString:[existingWord lowercaseString]];
if( textRange.location != NSNotFound ) {
// newWord contains the a substring of existingWord
shouldAddWord = NO;
break;
}
NSLog(@"(word:%@) does not contain (substring:%@)", newWord, existingWord);
shouldAddWord = YES;
}
if (shouldAddWord) {
NSLog(@"Adding word: %@", newWord);
[goodWords addObject:newWord];
}
}
}
NSLog(@"***Added words***");
int count = 1;
for (NSString *word in goodWords) {
NSLog(@"%d: %@", count, word);
count++;
}
[goodWords release];
}
Вывод:
***Added words***
1: cappucino
2: programme
3: objective
4: programmatic
5: cappucine