1

バックエンド サービスとしてParseを使用していますが、この例では、バックエンド スキーマを模倣する2 つのサンプル配列 (songsおよび) を作成しました。アプリのテーブルに入力する曲データで構成されています。現在のユーザーの曲の評価で構成されます。ratingssongsratings

最終的には、ループして、それぞれの辞書に埋め込む必要songsがありますratings。以下にループコードを含めました。これをより効率的に行うことはできますか? オブジェクトが多すぎると時間がかかりすぎるのではないかと心配しています。userRatingsongsratings

    NSMutableArray *songs = [@[ @{
                                @"objectId" : @"111",
                                @"title" : @"Song Title" },
                                @{
                                @"objectId" : @"222",
                                @"title" : @"Song Title"
                             } ] mutableCopy];

    NSMutableArray *ratings = [@[ @{
                               @"objectId" : @"999",
                               @"parentObjectId" : @"111",
                               @"userRating" : @4
                               } ] mutableCopy];

    for (NSInteger a = 0; a < songs.count; a++) {

        NSMutableDictionary *songInfo = [songs objectAtIndex:a];
        NSString *songObjectId = [songInfo objectForKey:@"objectId"];
        NSNumber *userRating = @0;

        for (NSInteger i = 0; i < ratings.count; i++) {

            NSDictionary *userRatingInfo = [ratings objectAtIndex:i];
            NSString *parentObjectId = [userRatingInfo objectForKey:@"parentObjectId"];

            if ([parentObjectId isEqualToString:songObjectId]) {
                userRating = [userRatingInfo objectForKey:@"userRating"];
            }
        }
    [songInfo setObject:userRating forKey:@"userRating"];
    }
4

1 に答える 1

3

内部ループの代わりに評価のディクショナリを作成します。ディクショナリ検索は一定の時間で償却されるため、時間の複雑さは n*m から n+m になります。

NSMutableDictionary* ratingsDict = [NSMutableDictionary dictionaryWithCapacity:ratings.count];
for (NSDictionary* rating in ratings) {
    NSString *parentObjectId = [rating objectForKey:@"parentObjectId"];
    [ratingsDict setObject:rating forKey:parentObjectId];
}

for (NSMutableDictionary* song in songs) {
    NSString *songObjectId = [song objectForKey:@"objectId"];
    NSNumber *userRating = [ratingsDict objectForKey:songObjectId];
    if (userRating)
        [song setObject:userRating forKey:@"userRating"];
}
于 2012-09-13T00:10:24.117 に答える