以下のように、x-code プロジェクトでカテゴリを作成しました。
+ (NSDictionary *)anagramMap {
static NSDictionary *anagramMap;
if (anagramMap != nil)
return anagramMap;
// this file is present on Mac OS and other unix variants
NSString *allWords = [NSString stringWithContentsOfFile:@"/usr/share/dict/words"
encoding:NSUTF8StringEncoding
error:NULL];
NSMutableDictionary *map = [NSMutableDictionary dictionary];
@autoreleasepool {
[allWords enumerateLinesUsingBlock:^(NSString *word, BOOL *stop) {
NSString *key = [word anagramKey];
if (key == nil)
return;
NSMutableArray *keyWords = [map objectForKey:key];
if (keyWords == nil) {
keyWords = [NSMutableArray array];
[map setObject:keyWords forKey:key];
}
[keyWords addObject:word];
}];
}
anagramMap = map;
return anagramMap;}
- (NSString *)anagramKey {
NSString *lowercaseWord = [self lowercaseString];
// make sure to take the length *after* lowercase. it might change!
NSUInteger length = [lowercaseWord length];
unichar sortedWord[length];
[lowercaseWord getCharacters:sortedWord range:(NSRange){0, length}];
qsort_b(sortedWord, length, sizeof(unichar), ^int(const void *a, const void *b) {
unichar c1 = *(const unichar *)a;
unichar c2 = *(const unichar *)b;
if (c1 > c2)
return -1;
if (c1 < c2)
return 1;
return 0;
});
return [NSString stringWithCharacters:sortedWord length:length];}
基本的に、このコードは Mac OSx 辞書をループして、キーがアルファベット順にソートされた単語であり、オブジェクトがその単語のすべてのアナグラムの配列である NSDictionary に変換します。
私が疑問に思っていたのは、ソートされたキーとオブジェクト配列のこの作成された辞書を NSDictionary (または可変) に割り当てる実装ファイルの viewDidLoad 部分などで、このメソッドをどのように呼び出すことができるかということです。基本的に疑似コードでは、次のようなことを行います。
NSMutableArray *englishDictionary = [[NSMutableArray alloc] init]; englishDictionary = [NSMutableArray anagramMapScrabble]; //これで、englishDictionary が NSDictionary に変わったことを意味する必要があります。ここで、キー = 並べ替えられた単語とオブジェクトは、その並べ替えられた単語の英語のアナグラムの配列です。
メソッドに追加のコードを追加する必要があると思いますが、よくわかりません。どんな提案でも大歓迎です!