0

sqliteデータベースからNSArrayにロードされる280.000以上の単語の膨大な単語リストがあります。次に、高速列挙を実行して、ユーザーが入力した特定の文字列値が配列内の単語の1つと一致するかどうかを確認します。アレイは非常に大きいため、iphone 4でそのアレイを通過するのに約1〜2秒かかります。

どうすればパフォーマンスを向上させることができますか?たぶん私はいくつかの小さな配列を作る必要がありますか?通過するデータが少なくなるように、アルファベットの各文字に1つずつ。

これが私のデータベースクラスの外観です

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");    
        }     
    }
}
4

3 に答える 3

4

さまざまな方法がたくさんあります。

  • 辞書またはセットにすべての単語を貼り付けて、存在のテストは高速です

  • あなたが提案するようにそれを分割します。ある種のツリー型構造を作成します。

  • データベースを使用して検索を行います。正しく構築されていれば、一般的にはまさにそれが得意です。

于 2012-08-15T17:10:17.783 に答える
0

スペースが問題にならない場合は、各単語のハッシュ値を保存し、それをベースルックアップに使用します。ハッシュでフィルタリングしたら、各単語を比較します。これにより、コストのかかる文字列比較の数が減ります。インデックス作成/並べ替えが簡単で、クイックルックアップを実行します。

于 2012-08-15T17:14:00.987 に答える
0

私は辞書を2番目にしています。目的のためのNSDictionaryc。

例えば:

//NSDictionarymyDictのすべてのキーと値のペアを出力します

 for(id key in myDict)
    NSLog(@"key=%@ value=%@", key, [myDict objectForKey:key]);
于 2012-08-15T17:15:11.590 に答える