iPhoneアプリ作成(9) 配列をグループングして件数をカウント
データベースなら、SQLで簡単にできる「グルーピング」ですが、
配列を「グルーピング」して「件数をカウント」する便利は標準的なクラスは無いみたい...
と、いうことで「Array配列をグループングして件数をカウント」するサンプルソースを作ってみました。
#import <Foundation/Foundation.h> //sortの比較関数 NSInteger stringSort(id obj1, id obj2, void *context){ NSInteger ret; if (context)ret = [obj2 compare:obj1]; //降順 else ret = [obj1 compare:obj2]; //昇順 return ret; } int main (int argc, constchar * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //配列を作成する NSMutableArray *array = [NSMutableArray array]; [array addObject:@"A"]; [array addObject:@"2"]; [array addObject:@"a"]; [array addObject:@"B"]; [array addObject:@"A"]; [array addObject:@"1"]; [array addObject:@"2"]; NSLog(@"total count = %d",[array count]); //配列を単一化する NSMutableSet *set = [NSMutableSet set]; for(id value in array)[set addObject:value]; //単一化された値をキーにして、件数を格納できる辞書を作成する NSMutableDictionary *dic = [NSMutableDictionary dictionary]; for(id key in set)[dic setObject:[NSNumber numberWithInt:0] forKey:key]; //単一化されたキー毎の件数をカウントする for(id key in set){ for(id value in array) if (key == value) { int cnt = [[dic objectForKey:key]intValue] +1; [dic setObject:[NSNumber numberWithInt:cnt] forKey:key]; } } //単一化されたキーを昇順にソートする NSMutableArray *array2 = [NSMutableArray array]; for(id value in set)[array2 addObject:value]; [array2 sortUsingFunction:stringSort context:(void*)0]; //キー毎の件数を表示する for(id key in array2)NSLog(@"%@ = %d",key,[[dic objectForKey:key]intValue]); [pool drain]; return0; }
◆結果
2011-03-17 15:41:14.919 tempTest[7835:a0f] total count = 7 2011-03-17 15:41:14.924 tempTest[7835:a0f] 1 = 1 2011-03-17 15:41:14.925 tempTest[7835:a0f] 2 = 2 2011-03-17 15:41:14.925 tempTest[7835:a0f] A = 2 2011-03-17 15:41:14.926 tempTest[7835:a0f] B = 1 2011-03-17 15:41:14.932 tempTest[7835:a0f] a = 1