我有一个超过280.000+单词的巨大单词列表,从sqlite数据库加载到NSArray。然后我做一个快速枚举来检查用户输入的某个字符串值是否与Array中的一个单词匹配。由于阵列太大,因此在iphone 4上通过该阵列大约需要1-2秒。
如何改善表现?也许我应该制作几个较小的阵列?字母表中每个字母一个,这样就可以减少数据。
这是我的数据库类的外观
static WordDatabase *_database;
+(WordDatabase *) database
{
if (_database == nil) {
_database = [[WordDatabase alloc] init];
}
return _database;
}
- (id) init
{
if ((self = [super init])) {
NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"dictionary" ofType:@"sqlite"];
if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
NSLog(@"Failed to open database!");
}
}
return self;
}
- (NSArray *)dictionaryWords {
NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease];
NSString *query = @"SELECT word FROM words";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char *wordChars = (char *) sqlite3_column_text(statement, 0);
NSString *name = [[NSString alloc] initWithUTF8String:wordChars];
name = [name uppercaseString];
[retval addObject:name];
}
sqlite3_finalize(statement);
}
return retval;
}
然后在我的主视图中,我将其初始化为
dictionary = [[NSArray alloc] initWithArray:[WordDatabase database].dictionaryWords];
最后我使用这个方法浏览数组
- (void) checkWord
{
NSString *userWord = formedWord.wordLabel.string;
NSLog(@"checking dictionary for %@", userWord);
for (NSString *word in dictionary) {
if ([userWord isEqualToString: word]) {
NSLog(@"match found");
}
}
}
答案 0 :(得分:4)
有很多不同的方式。
将所有单词粘贴在字典或集合中,对存在的测试很快
按照你的建议打破它;创建某种树型结构。
使用数据库进行搜索。如果构造正确,他们通常都非常擅长。
答案 1 :(得分:0)
如果空间不是问题,请存储每个单词的哈希值,并将其用于基本查找。一旦被哈希过滤,则比较每个单词。这将减少昂贵的字符串比较的数量。更容易索引/排序并执行快速查找。
答案 2 :(得分:0)
我是第二本字典。 NSDictionary的目标c。
例如:
//打印出NSDictionary myDict
中的所有键值对 for(id key in myDict)
NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);